SqlDateTime.MinValue!= DateTime.MinValue,为什么?
我想知道为什么SqlDateTime.MinValue和DateTime.MinValue不一样?
我认为SQL和.NET的Date数据types之间的差别源于SQL Server的date时间数据types,它的最小值和最大值以及它的精度比.NET的DateTime数据types要早得多。
随着.NET的出现,团队决定Datetime数据types应该有一个更自然的最小值,01/01/0001似乎是一个相当合理的select,当然从编程语言 ,而不是数据库的angular度来看,这个值是更自然。
顺便说一下,在SQL Server 2008中,有许多新的基于Date的数据types( Date , Time , DateTime2 , DateTimeOffset )实际上提供了更大的范围和精度,并紧密映射到.NET中的DateTime数据types。 例如,DateTime2数据types的date范围从0001-01-01到9999-12-31。
SQL Server的标准“date时间”数据types总是有最小值01/01/1753(事实上仍然有!)。 我必须承认,我也很好奇这个价值的意义,所以做了一些挖掘。我发现如下:
从公元一世纪到今天,西方世界实际上使用了两个主要日历:朱利叶斯·凯撒的儒略历和格列高利十三世的公历。 两个日历只有一个规则不同:决定什么是闰年的规则。 在儒略历中,可以被四整除的年份都是闰年。 在公历中,可以被四除的所有年份都是闰年,但可以被100除尽(但不能被400整除)的年份不是闰年。 因此,1700年,1800年和1900年是茱利亚历法上的闰年,而不是公历中的闰年,而1600年和2000年是两个历法上的闰年。
当教宗格列高利十三世在1582年介绍他的历法时,他还指示1582年10月4日至1582年10月15日之间的日子应该被跳过 – 也就是说,10月4日之后的那天应该是10月15日。但是延迟了。 英格兰和她的殖民地没有从朱利安到格里高利的转换,直到1752年,所以对他们来说,这些跳跃date是在1752年9月4日到9月14日之间。其他国家在其他时间转换,但1582年和1752年是相关date我们正在讨论的DBMS。
因此,当人们回溯多年时,数据算术会出现两个问题。 首先是应该按照朱利安或格里高利的规则计算闰年? 第二个问题是,何时以及如何处理跳过的日子?
这就是八大DBMS如何处理这些问题:
假装没有开关。 这就是SQL标准所要求的,尽pipe标准文件还不清楚:它只是说date“受到公历使用date的自然规则的约束” – 不pipe“自然规则”是什么。 这是DB2select的选项。 假如一个日历的规则总是适用于没有人听说日历的时候,那么这个技术术语就是“预示性日历”正在生效。 所以,举例来说,我们可以说DB2遵循了一个格雷戈里的日历。
完全避免这个问题。 Microsoft和Sybase在1753年1月1日设置了最低date值,安全地超过了美国切换日历的时间。 这是可以防范的,但是时不时的投诉表明,这两个DBMS缺乏其他DBMS具有的且SQL标准所要求的有用function。
select1582.这是Oracle做的。 Oracle用户会发现,1582年10月15日减去1582年10月4日的date – 算术expression式的值为1天(因为10月5日至14日不存在),并且2月29日1300date是有效的(因为Julian跳跃 – 年规则适用)。 为什么Oracle在SQL标准似乎并不需要的时候会遇到额外的麻烦? 答案是用户可能需要它。 历史学家和天文学家使用这个混合系统,而不是一个预先格雷戈里日历。 (这也是Sun在实现Java的GregorianCalendar类时select的默认选项 – 尽pipe名称是GregorianCalendar,但它是混合日历。)
以上引用来自以下链接:
SQL性能调优:SQL中的date
由于在SQL Server中可以存储在date时间字段(1753/1/1)中的最小date不等于DateTime .NET数据types(0001/1/1)的MinValue。
1753年是格里历(英格兰)的第一个采用者的date。 至于为什么select01/01/0001 – 这在20世纪90年代从SQL Server恢复到Sybase时是毫无疑问的。 他们必须尽早做出devise决定,Microsoft SQL团队没有看到改变它的理由。
自从.NET的爆炸式发展以及将它集成到Sql Server之后,现在就有了DateTime2对象来兼容。 如果你是一个NHibernate用户, 你可以在你的types映射中提供这个types来避免DateTime.Min
问题
除了公历之外,.NETdate还可以用于其他日历:
- 日历
- ChineseLunisolarCalendar
- EastAsianLunisolarCalendar
- 公历
- 希伯来历
- HijriCalendar
- 和历
- JapaneseLunisolarCalendar
- JulianCalendar
- KoreanCalendar
- KoreanLunisolarCalendar
- PersianCalendar
- TaiwanCalendar
- TaiwanLunisolarCalendar
- ThaiBuddhistCalendar
- UmAlQuraCalendar
JulianCalendar事件dateDateTime.MinValue
两个不同的小组决定了“最小”对date/时间的意义。
SQL使用DateTime的不同内部表示。