为什么是 1753?他们对 1752 有什么看法?我的曾曾曾曾曾曾曾祖父会非常生气。
6 回答
使用 1753 年 1 月 1 日 ( 1753-01-01
) 作为 SQL Server 中日期时间的最小日期值的决定可以追溯到其Sybase 起源。
日期本身的重要性虽然可以归因于这个人。
菲利普·斯坦霍普,第四代切斯特菲尔德伯爵。谁在英国议会通过了1750 年日历(新样式)法案。这立法为英国及其当时的殖民地采用公历。
1752 年,当最终从儒略历进行调整时,英国历法中有一些缺失的日子(互联网档案链接) 。1752 年 9 月 3 日至 1752 年 9 月 13 日丢失。
Kalen Delaney以这种方式解释了选择
那么,失去了 12 天,您如何计算日期?例如,如何计算 1492 年 10 月 12 日和 1776 年 7 月 4 日之间的天数?你包括那些失踪的 12 天吗?为了避免不得不解决这个问题,最初的 Sybase SQL Server 开发人员决定不允许 1753 年之前的日期。您可以使用字符字段存储更早的日期,但不能将任何日期时间函数用于存储在字符中的更早日期字段。
选择 1753 年似乎有点以盎格鲁为中心,但在英国实施之前,欧洲许多天主教国家已经使用了 170 年(最初由于教会的反对而推迟)。相反,许多国家直到 1918 年在俄罗斯才改革他们的历法。事实上,1917 年的十月革命于公历 11 月 7 日开始。
乔的回答中提到的两者datetime
和新数据类型都没有尝试考虑这些本地差异,而只是使用公历。datetime2
所以随着更大的范围datetime2
SELECT CONVERT(VARCHAR, DATEADD(DAY,-5,CAST('1752-09-13' AS DATETIME2)),100)
退货
Sep 8 1752 12:00AM
数据类型的最后一点datetime2
是,它使用了预测的公历,它在实际发明之前向后投影,因此在处理历史日期时用途有限。
这与其他软件实现形成对比,例如 Java Gregorian Calendar类,该类默认遵循儒略历直到 1582 年 10 月 4 日,然后在新的公历中跳转到 1582 年 10 月 15 日。它正确处理了该日期之前的闰年儒略模型和该日期之后的公历模型。调用者可以通过调用来更改截止日期setGregorianChange()
。
可以在这里找到一篇相当有趣的文章,讨论采用日历的一些更多特性。
您的曾曾曾曾曾曾祖父应该升级到 SQL Server 2008 并使用DateTime2数据类型,它支持的日期范围为:0001-01-01 到 9999-12-31。
这就是日期问题以及大型 DBMS 如何处理这些问题的全部内容。
从公元 1 年到今天,西方世界实际上使用了两种主要的历法:凯撒大帝的儒略历和教皇格列高利十三世的公历。两种历法的不同之处仅在于一条规则:决定闰年的规则。在儒略历中,所有能被四整除的年份都是闰年。在公历中,所有能被 4 整除的年份都是闰年,除了能被 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。
因此,当一个回溯多年时,日期算术会出现两个问题。第一个是,转换前的闰年应该按照儒略规则还是公历规则计算?第二个问题是,应该何时以及如何处理跳过的天数?
这就是 Big 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 日不存在)并且日期 1300 年 2 月 29 日是有效的(因为儒略闰-年规则适用)。当 SQL 标准似乎没有要求时,为什么 Oracle 还要额外麻烦?答案是用户可能需要它。历史学家和天文学家使用这种混合系统而不是预测的公历。(这也是 Sun 在为 Java 实现 GregorianCalendar 类时选择的默认选项——尽管名称如此,但 GregorianCalendar 是一个混合日历。)
顺便说一句,Windows 不再知道如何在过去几年的 3 月/4 月或 10 月/11 月的某些日期将 UTC 正确转换为美国当地时间。这些日期的基于 UTC 的时间戳现在有些荒谬。操作系统在美国政府最新的 DST 规则之前拒绝处理任何时间戳是非常讨厌的,因此它只是错误地处理了其中一些。SQL Server 拒绝处理 1753 年之前的日期,因为需要大量额外的特殊逻辑才能正确处理它们,并且它不想错误地处理它们。