gpt4 book ai didi

sql - 使用毫秒查询日期时间字段在 SQL Server 中给出错误结果

转载 作者:行者123 更新时间:2023-12-04 05:35:11 26 4
gpt4 key购买 nike

我在 SQL Server 2005 中使用日期时间字段时遇到了一个奇怪的错误。日期时间字段以毫秒级别的精度显示,但看起来并不总是使用毫秒。这是我的测试查询:

SELECT col1, YEAR(col1) AS yr, MONTH(col1) AS mn, DAY(col1) AS dy
FROM mytable
WHERE col1 >= '2009-12-31 00:00:00.0' AND col1 <= '2009-12-31 23:59:59.999'
ORDER BY col1

在我的结果中,我得到:

列 1 |年 |锰 |日
------------------------------+------+----+----
2009-12-31 00:00:00:00.000 | 2009 | 12 | 31
2010-01-01 00:00:00:00.000 | 2010 | 1 | 1

问题是我得到了 2010-01-01 日期,即使它不应该小于或等于“2009-12-31 23:59:59.999”。但是,如果我将查询更改为使用“2009-12-31 23:59:59.998”,则它可以正常工作(不返回 2010 日期时间)。

这是一个错误,还是这就是 SQL Server 的工作方式?如果这是它的工作原理,有什么原因吗?我遇到了从 MySQL 迁移一些查询的问题,这按预期工作(即使 MySQL 甚至不存储毫秒!)。

最佳答案

SQL Server将时间部分存储为 1/300 的编号从午夜开始的第二个长滴答声。
23:59:59.999被四舍五入到最近的刻度,恰好是 00:00:00.000第二天的。

SELECT  CAST(CAST('2009-12-01 00:00:00.000' AS DATETIME) AS BINARY(8)),
CAST(CAST('2009-12-01 23:59:59.997' AS DATETIME) AS BINARY(8)),
CAST(CAST('2009-12-01 23:59:59.999' AS DATETIME) AS BINARY(8))



0x00009B8F 00000000 0x00009B8F 018B81FF 0x00009B90 00000000

在第一个值中,日期部分 0x9B8F ( 39823 ) 是自 Jan 1st, 1900 以来的天数,以及时间部分, 0 , 是自午夜以来的滴答数。

在第二个值中, 0x018B81FF ( 2591999924 * 60 * 60 * 300 - 1 )是自午夜以来的最大可能刻度数。

最后,第三个值是 0在时间部分和日期部分加一。

关于sql - 使用毫秒查询日期时间字段在 SQL Server 中给出错误结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2049645/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com