Answers:
1753-01-01
在SQL Server中使用1753年1月1日()作为日期时间的最小日期值的决定可以追溯到Sybase的起源。
日期本身的意义虽然可以归因于这个人。
切斯特菲尔德第四伯爵菲利普·斯坦霍普(Philip Stanhope)。谁通过英国议会领导了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日开始。
Joe的答案中提到的这两种数据类型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日为止,然后在新的Gregorian日历中跳至1582年10月15日。它可以正确处理该日期之前的leap年的朱利安模型和该日期之后的公历模型。呼叫者可以通过致电更改转换日期setGregorianChange()
。
可以在这里找到一篇颇具娱乐性的文章,其中讨论了采用日历的更多特性。
您的曾曾曾曾祖父应升级到SQL Server 2008并使用DateTime2数据类型,该数据类型支持范围为0001-01-01至9999-12-31的日期。
1752年是英国从儒略历转换为公历的一年。我相信1752年9月的两个星期从未发生过,因此影响了该地区的日期。
说明:http : //uneasysilence.com/archive/2007/08/12008/(Internet存档版本)
这是整个故事,日期问题是如何发生的,以及大型DBMS如何处理这些问题。
在公元1日到今天之间,西方世界实际上使用了两个主要日历:朱利叶斯·凯撒的儒略历和教皇格里高利十三世的公历。两个日历的区别仅在于一条规则:确定:年是什么的规则。在儒略历中,所有可以被四整除的年份是leap年。在公历中,所有可被4整除的年份都是years年,但不能被100整除(但不能被400整除)的年份不是leap年。因此,年份1700、1800和1900是儒略历中的leap年,但不是公历,而1600和2000是两个历法中的leap年。
当教皇格里高利十三世在1582年提出日历时,他还指示应该跳过1582年10月4日至1582年10月15日之间的日期,也就是说,他说10月4日之后的第二天应该是10月15日。许多国家但是,延迟了转换。英格兰和她的殖民地直到1752年才从朱利安转向格里高利安,因此对于他们来说,跳过的日期是在1752年9月4日至9月14日之间。其他国家/地区则在其他时间转换,但1582和1752年是该日期的相关日期。我们正在讨论的DBMS。
因此,当日期追溯到很多年时,日期算术会出现两个问题。首先是,应该根据朱利安规则或格里高利规则计算转换之前的leap年吗?第二个问题是,何时以及如何处理跳过的日子?
大型DBMS就是这样处理以下问题的:
- 假装没有开关。尽管标准文件尚不清楚,但这似乎是SQL标准的要求:它只是说日期“受公历使用日期的自然规则约束”,无论“自然规则”是什么。这是DB2选择的选项。如果假装单个日历的规则即使在没有人听说过日历的情况下也始终适用,则技术术语是“多用”日历有效。因此,例如,我们可以说DB2遵循一个多事的公历。
- 完全避免该问题。Microsoft和Sybase将其最小日期值设置为1753年1月1日,这已经超过了America转换日历的时间。这是可以辩护的,但有时会抱怨说这两个DBMS缺乏其他DBMS所具有的有用功能以及SQL Standard所要求的。
- 选择1582。这就是Oracle所做的。Oracle用户会发现日期算术表达式1582年10月15日减去1582年10月4日得出的值是1天(因为10月5-14日不存在),并且日期1300年2月29日有效(因为朱利安飞跃式-年份规则适用)。当SQL Standard似乎不需要Oracle时,为什么会给它带来更多麻烦呢?答案是用户可能需要它。历史学家和天文学家使用这种混合系统代替了多事的格里高利历。(这也是Sun在为Java实现GregorianCalendar类时选择的默认选项-尽管名称为GregorianCalendar,但它是一个混合日历。)