2009-04-30 48 views

回答

128

我認爲SQL的和.NET的日期數據類型之間的差異的事實,SQL Server的日期時間數據類型,它的最小值和最大值的莖,它的精確度比.NET的日期時間數據類型大得多。

隨着.NET的到來,球隊決定日期時間數據類型都應該有一個更自然最小值,並且01/01/0001似乎是一個相當合理的選擇,當然從編程語言,而不是數據庫的角度來看,這個值更自然。

順便說一句,在SQL Server 2008中,有一些新的基於日期的數據類型(DateTimeDateTime2DateTimeOffset)實際上確實提供了一個增加的範圍和精度,並密切映射到在.net中datetime數據類型。例如,DateTime2數據類型的日期範圍從0001-01-01到9999-12-31。

SQL Server的標準「datetime」數據類型始終有一個最小值01/01/1753(實際上仍然有!)。我必須承認,我也很好奇這個值的意義,所以做了一些挖..我發現,如下:

在1個AD和今天之間的時期,西方世界已經實際使用兩個主要日曆:朱利葉斯凱撒的儒略曆和格雷戈裏十三世的格利高裏歷。這兩個日曆只有一個規則不同:決定閏年的規則。在儒略曆中,可以被四整除的所有年份都是閏年。在公曆中,所有可以被四整除的年份都是閏年,但可以被100除盡的年份(但不能被400整除)不是閏年。因此,1700年,1800年和1900年是儒略曆中的閏年,但不是公曆中的日曆,而1600年和2000年是兩個日曆中的閏年。當教皇格里高利十三世在1582年推出他的日曆時,他還指示1582年10月4日至1582年10月15日之間的日子應該被跳過 - 也就是說,他說10月4日之後的那天應該是10月15.儘管如此,許多國家推遲了改變。英格蘭和她的殖民地沒有從朱利安到格列高利的轉換,直到1752年,所以對他們來說,跳過日期是1752年9月4日到9月14日。其他國家在其他時間轉換,但1582年和1752年是相關的日期我們正在討論的DBMS。

因此,當人們回溯多年時,日期算術會出現兩個問題。首先是,應該根據朱利安或格里高利的規則來計算轉換前的閏年?第二個問題是,何時以及如何處理跳過的日期?

這是八大DBMS中如何處理這些問題:

  • 假裝沒有開關。這正是SQL標準似乎需要的,儘管標準文檔尚不清楚:它只是說日期「受到了使用公曆的日期的自然規則的約束」 - 無論「自然規則」是什麼。這是DB2選擇的選項。當假裝某個日曆的規則總是適用於沒有人聽說日曆的時候,技術術語是「預示性」日曆有效。所以,舉個例子,我們可以說DB2遵循一個格雷戈裏日曆。

  • 完全避免此問題。 Microsoft和Sybase在1753年1月1日設置了它們的最低日期值,安全地超過了美國切換日曆的時間。這是可以捍衛的,但時不時投訴表明這兩個DBMS缺乏其他DBMS具有且SQL標準要求的有用功能。

  • 選擇1582.這就是Oracle所做的。一個Oracle用戶會發現日期算術表達式1582年10月15日減去1582年10月4日的值爲1天(因爲10月5日至14日不存在)並且日期2月29日1300是有效的(因爲Julian跳躍 - 年規則適用)。爲什麼Oracle在SQL標準似乎不需要它時遇到額外的麻煩?答案是用戶可能需要它。歷史學家和天文學家使用這種混合系統,而不是預測格里曆。 (這也是Sun公司執行的Java-儘管名字的GregorianCalendar是一種混合日曆GregorianCalendar的類時選擇了默認選項。)

這以上報價從下面的鏈接採取:

SQL Performance Tuning: Dates in SQL

7

兩個不同的組決定了「最小」對日期/時間的意義。

+1

我認爲,這是確切的答案。 (沒有諷刺意味) – nothrow 2009-04-30 07:31:56

+0

是的,我認爲它也是如此。 – Phil 2009-10-27 22:10:54

+1

老兄,如果你被低估了,那是因爲你給了一個愚蠢的回答......「因爲我這麼說」,當人問的年齡超過10歲(我在那裏慷慨時)並不算作答案。但我沒有倒下你:-) – 2010-01-21 23:48:55

5

SQL對DateTime使用不同的內部表示。

+5

這對OP的問題有什麼幫助? – ANeves 2010-06-04 17:09:19

12

因爲在SQL Server中可以存儲在日期時間字段(1753/1/1)中的最小日期不等於DateTime .NET數據類型(0001/1/1)的MinValue。

10

1753年是格列高利曆(英格蘭)的第一個採用者的日期。至於爲什麼選擇這個選項的原因是01/01/01以上 - 這無疑是SQL Server在20世紀90年代迴歸Sybase時的遺產。他們必須儘早做出設計決定,而Microsoft SQL團隊沒有看到改變它的理由。由於.NET的爆炸式以及它與Sql Server的集成,現在有了兼容性的對象。如果您是NHibernate用戶,請在您的類型映射中使用you can provide this type以避免DateTime.Min問題

。NET日期迎合其他日曆除了公曆一個:

  • Calendar
    • ChineseLunisolarCalendar
    • EastAsianLunisolarCalendar
    • 的GregorianCalendar
    • 希伯來曆
    • HijriCalendar
    • 和歷
    • JapaneseLunisolarCalendar
    • JulianCalendar
    • KoreanCalendar
    • KoreanLunisolarCalendar
    • PersianCalendar
    • TaiwanCalendar
    • TaiwanLunisolarCalendar
    • ThaiBuddhistCalendar
    • UmAlQuraCalendar

的JulianCalendar INFACT預日期DateTime.MinValue

相關問題