我想知道,为什么 SqlDateTime.MinValue 与 DateTime.MinValue 不一样?
我认为 SQL 和 .NET 之间的区别Date数据类型源自 SQL Server 的事实datetime数据类型、最小值和最大值以及精度都比 .NET 的 DateTime 数据类型早得多。
随着 .NET 的出现,团队决定 Datetime 数据类型应该具有更多功能natural最小值,01/01/0001 似乎是一个相当合乎逻辑的选择,而且肯定来自编程语言, 而不是database从角度来看,这个值是比较自然的。
顺便说一句,在 SQL Server 2008 中,出现了许多新的基于日期的数据类型(Date, Time, 日期时间2, 日期时间偏移量)实际上确实提供了更大的范围和精度,并且紧密映射到 .NET 中的 DateTime 数据类型。例如,DateTime2 数据类型的日期范围为 0001-01-01 到 9999-12-31。
SQL Server 的标准“日期时间”数据类型始终具有最小值 01/01/1753(实际上仍然如此!)。我必须承认,我也很好奇这个值的意义,所以也进行了一些挖掘。我发现如下:
从公元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。
因此,当人们追溯到很多年前时,日期算术会出现两个问题。第一个问题是,转换前的闰年应该按照儒略规则还是公历规则计算?第二个问题是,跳过的日子应该何时以及如何处理?
这就是八大 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 是一个混合日历。)
上述引用摘自以下链接:
SQL 性能调优:SQL 中的日期
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)