为什么是1753年?他们对1752年有什么意见吗?我的曾曾曾曾曾曾曾祖父会感到非常冒犯。
为什么是1753年?他们对1752年有什么意见吗?我的曾曾曾曾曾曾曾祖父会感到非常冒犯。
在SQL Server中,将1月1日1753年(1753-01-01
)作为datetime的最小日期值的决定可以追溯到其Sybase起源。
然而,这个日期本身的重要性可以归功于这个人。
第四代切斯特菲尔德伯爵 Philip Stanhope 推动 新样式日历法案 通过英国议会。该法案规定英国及其殖民地采用公历。
1752 年,当英国从儒略历调整为公历时,英国历法中出现了一些缺失的天数(互联网档案馆链接)。1752 年 9 月 3 日至 1752 年 9 月 13 日被遗漏。
Kalen Delaney 解释 了这个选择的原因
选用1753年作为起始年似乎有点英国中心主义,因为欧洲许多天主教国家在英国实施之前已经使用了这个日历170年(最初由于教会的反对而推迟)。相反,许多国家直到1918年才改革他们的日历,俄罗斯更是如此。事实上,1917年的十月革命在格里高利历下是在11月7日开始的。那么,在失去 12 天后,你如何计算日期呢?例如,你如何计算 1492 年 10 月 12 日和 1776 年 7 月 4 日之间的天数?你包括那 12 天吗?为了避免解决这个问题,最初的 Sybase SQL Server 开发人员决定不允许在 1753 年之前使用日期。您可以使用字符字段存储早期日期,但是您无法使用任何日期时间函数来处理存储在字符字段中的早期日期。
datetime
和Joe's answer提到的新的datetime2
数据类型都没有尝试考虑这些本地差异,只是使用格里高利历。
因此,使用更大范围的datetime2
SELECT CONVERT(VARCHAR, DATEADD(DAY,-5,CAST('1752-09-13' AS DATETIME2)),100)
Sep 8 1752 12:00AM
< p > datetime2
数据类型的最后一点是,它使用proleptic Gregorian calendar向后推算到实际发明之前,因此在处理历史日期方面有限制。
这与其他软件实现形成对比,例如Java Gregorian Calendar类,默认遵循儒略历,直到1582年10月4日,然后跳转到新的公历1582年10月15日。在此日期之前,它正确地处理闰年的儒略模型;在此日期之后,它正确地处理公历模型。调用者可以通过调用setGregorianChange()
来更改过渡日期。
一个相当有趣的文章讨论了一些有关采用日历的特殊情况,can be found here。
你的曾曾曾曾曾曾曾祖先应该升级到SQL Server 2008并使用DateTime2数据类型,该数据类型支持0001年01月01日至9999年12月31日范围内的日期。
顺便提一下,在过去的某些三月/四月或十月/十一月中,Windows不再知道如何正确地将UTC转换为美国当地时间。这些日期的基于UTC的时间戳现在有点荒谬。操作系统拒绝处理美国政府最新的DST规则之前的任何时间戳会非常棘手,因此它只是错误地处理其中一些时间戳。SQL Server拒绝处理1753年之前的日期,因为需要处理大量特殊逻辑才能正确处理它们,而且不想处理错误。