为什么选择1753?他们对1752有什么看法?我伟大伟大的曾伟大曾祖父会非常冒犯。
答案 0 :(得分:790)
使用1753年1月1日(1753-01-01
)作为SQL Server中日期时间的最小日期值的决定可以追溯到Sybase origins。
日期本身的重要性可以归结为这个人。
菲利普斯坦霍普,切斯特菲尔德的第四伯爵。谁通过英国议会引导Calendar (New Style) Act 1750。立法通过了英国及其当时殖民地的公历。
1752年英国历法中有一些missing days,最后调整是从朱利安历法出发的。 1752年9月3日至1752年9月13日失踪。
Kalen Delaney explained选择这种方式
所以,失去了12天,你怎么能 计算日期?例如,怎么可以 你计算之间的天数 1492年10月12日和1776年7月4日?做 你包括那些缺少12天的人?至 避免必须解决这个问题, 原始的Sybase SQL Server 开发商决定不允许约会 在1753年之前。您可以提前存储 使用字符字段的日期,但是 你不能使用任何日期时间功能 与您存储的早期日期 在字符领域。
1753的选择看起来似乎有些偏心,但欧洲的many catholic countries在英国实施之前已经使用了170年的历法(最初由于反对而推迟by the church)。相反,许多国家直到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
setGregorianChange()
数据类型的最后一点是它在实际发明之前使用Joe's answer向后投射,因此在处理历史日期时用途有限。
这与其他软件实现形成了鲜明对比,例如Java proleptic Gregorian calendar类默认遵循Julian日历的日期,直到1582年10月4日,然后在新的公历中跳到1582年10月15日。它正确处理该日期之前的闰年Julian模型和该日期之后的Gregorian模型。调用者可以通过调用{{1}}来更改切换日期。
一篇相当有趣的文章,通过采用日历Gregorian Calendar来讨论一些更多的特点。
答案 1 :(得分:92)
伟大的曾伟大的曾祖父应该升级到SQL Server 2008并使用DateTime2数据类型,它支持的范围是:0001-01-01到9999-12-31。
答案 2 :(得分:26)
解释: http://uneasysilence.com/archive/2007/08/12008/(Internet Archive version)
答案 3 :(得分:17)
这是完整的故事,日期问题是如何以及大DBMS如何处理这些问题。
在公元1世纪到今天,西方世界都有 实际上使用了两个主日历:Julius Caesar的Julian日历 以及教皇格里高利十三世的格里高利历。这两个日历 只有一条规则不同:决定什么的规则 闰年是。在朱利安历法中,所有可被四整除的年份都是 闰年。在格里高利历中,所有可被四整除的年份都是 闰年,除了可被100整除的年份(但不能被整除 400)不是闰年。因此,1700年,1800年和1900年是飞跃 朱利安历法中的年份,而不是公历中的年份 1600和2000年是两个日历的闰年。
当教皇格雷戈里十三世在1582年介绍他的历法时,他也是 指示1582年10月4日至1582年10月15日之间的日子, 应该跳过 - 也就是说,他说10月4日之后的那一天应该 10月15日。许多国家推迟了转变。英国 她的殖民地没有从朱利安转向格列高利的计算 直到1752年,对他们来说,跳过的日期是在9月4日之间 1752年9月14日。其他国家在其他时间转换,但是 1582和1752是我们DBMS的相关日期 讨论
因此,当一个人返回许多时,日期算术会产生两个问题 年份。首先,应该在开关计算之前闰年 根据朱利安或格列高利规则?第二个问题是, 何时以及如何处理跳过的日子?
这就是Big DBMS处理这些问题的方式:
- 假装没有开关。这就是SQL标准所看到的 要求,虽然标准文件不清楚:它只是说 日期受到使用日期的自然规则的约束 公历" - 无论什么"自然规则"是。这是选项 DB2选择了。当假装有一个日历时 规则总是适用于没有人听说过的时候 日历,技术术语是" proleptic"日历在 力。因此,举例来说,我们可以说DB2遵循了一种预示 阳历日历。
- 完全避免这个问题。微软和Sybase 在1753年1月1日设置他们的最小日期值,安全地超过时间 美国改变了日历。这是可以辩护的,但从时间到 时间投诉表明这两个DBMS缺乏实用性 其他DBMS具有的功能和SQL标准 需要。
- 选择1582.这就是Oracle所做的。 Oracle用户会 发现日期算术表达式1582年10月15日减去10月 4 1582产生1天的价值(因为10月5日至14日不存在)和 那个日期是2月29日1300有效(因为朱利安闰年 规则适用)。为什么Oracle在SQL时会遇到麻烦 标准似乎不需要它?答案是用户可能 需要它。历史学家和天文学家使用这种混合系统 一个公历的格里高利历。 (这也是默认选项 在实现GregorianCalendar类时,Sun选择了 Java - 尽管名称,GregorianCalendar是一个混合日历。)
答案 4 :(得分:8)
顺便提一下,Windows不再知道如何在过去几年的三月/四月或十月/十一月的某些日期将UTC正确转换为美国当地时间。这些日期的基于UTC的时间戳现在有点荒谬。操作系统在美国政府最新的DST规则之前简单地拒绝处理任何时间戳是非常棘手的,因此它只是处理其中一些错误。 SQL Server拒绝在1753年之前处理日期,因为需要许多额外的特殊逻辑来正确处理它们,并且它不希望错误地处理它们。