[sql-server] SQL Server中1/1/1753的意義是什麼?



Answers

您偉大的偉大偉大偉大偉大的祖父應升級到SQL Server 2008並使用DateTime2數據類型,它支持日期範圍:0001-01-01到9999-12-31。

Question

為什麼1753? 他們對1752有什麼反應? 我偉大偉大偉大偉大偉大的祖父會非常冒犯。




這就是日期問題的全貌以及Big DBMS如何處理這些問題。

在公元1至今的這段時間裡,西方世界實際上使用了兩種主要日曆:Julius Caesar的Julian日曆和Gregory XIII教皇的公曆。 這兩個日曆只有一個規則不同:決定閏年的規則。 在儒略歷中,可以被四整除的所有年份都是閏年。 在公曆中,所有可以被四整除的年份都是閏年,但可以被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,但它是混合日曆。)

來源1和2




Related