我在想,爲什麼SqlDateTime.MinValue和DateTime.MinValue不一樣?SqlDateTime.MinValue!= DateTime.MinValue,爲什麼?
回答
我認爲SQL的和.NET的日期數據類型之間的差異的事實,SQL Server的日期時間數據類型,它的最小值和最大值的莖,它的精確度比.NET的日期時間數據類型大得多。
隨着.NET的到來,球隊決定日期時間數據類型都應該有一個更自然最小值,並且01/01/0001似乎是一個相當合理的選擇,當然從編程語言,而不是數據庫的角度來看,這個值更自然。
順便說一句,在SQL Server 2008中,有一些新的基於日期的數據類型(Date,Time,DateTime2,DateTimeOffset)實際上確實提供了一個增加的範圍和精度,並密切映射到在.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 Server中可以存儲在日期時間字段(1753/1/1)中的最小日期不等於DateTime .NET數據類型(0001/1/1)的MinValue。
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
- 1. SqlDateTime.MinValue是1753.爲什麼?
- 2. 什麼是Crystal Reports的DateTime.MinValue?
- 3. 爲什麼將Winforms DateTimePicker設置爲DateTime.MinValue失敗?
- 4. C# - 爲什麼DateTime.MinValue和MaxValue不是編譯時常量?
- 5. C#:爲什麼我的SqlDateTime.MinValue在不同的機器上有所不同?
- 6. 如何將sqldatetime.minvalue轉換爲datetime?
- 7. 爲什麼我不能使用DateTime.MinValue和int.MinValue作爲C#4.0中的可選值?
- 8. 的DBNull與DateTime.MinValue
- 9. 覆蓋DateTime.MinValue
- 10. 爲什麼DateTime.MinValue不能在UTC之前的時區中序列化?
- 11. 爲什麼Azure表存儲具有與.NET不同的DateTime.MinValue限制
- 12. 將C#中的DateTime.MinValue替換爲sql
- 13. 轉換DateTime.MinValue到的DateTimeOffset
- 14. 與DateTime.MinValue匹配的模式?
- 15. DateTime.TryParse無法解析DateTime.MinValue
- 16. DateTime在NULL值爲DateTime.MinValue或NULL時爲空
- 17. 的DateTime XAML綁定字符串格式顯示「空」爲DateTime.MinValue
- 18. 使用DateTime.MinValue或可爲空的DateTime會更好嗎?
- 19. ASP.Net WebMethod失敗,因爲ko.toJSON()對DateTime.MinValue產生不同結果
- 20. ViewModel中的日期時間顯示爲控制器中的DateTime.MinValue
- 21. 如果綁定值爲DateTime.MinValue,則不觸發WPF動畫
- 22. 的HttpCookie用過期集返回DateTime.MinValue
- 23. Mongo'find'方法不適用於DateTime.MinValue
- 24. C#JavaScriptSerializer和DateTime.MinValue穿越時區
- 25. 爲什麼叫StackOverflowException?爲什麼不HeapOverSizedException?
- 26. 爲什麼要爲
- 27. 爲什麼ISO_C_BINDING
- 28. 爲什麼不
- 29. NullPointerException爲什麼?
- 30. IndexOutofBoundException爲什麼?
我認爲,這是確切的答案。 (沒有諷刺意味) – nothrow 2009-04-30 07:31:56
是的,我認爲它也是如此。 – Phil 2009-10-27 22:10:54
老兄,如果你被低估了,那是因爲你給了一個愚蠢的回答......「因爲我這麼說」,當人問的年齡超過10歲(我在那裏慷慨時)並不算作答案。但我沒有倒下你:-) – 2010-01-21 23:48:55