当前位置: 首页 > 面试题库 >

以毫秒为单位的日期时间字段查询在SQL Server中给出错误的结果

范彭亮
2023-03-14
问题内容

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

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

在我的结果中,我得到:

col1 | yr | mn | dy
---------------------------- + ------ + ---- + ----
 2009-12-31 00:00:00:00.000 | 2009 | 12 | 31
 2010-01-01 00:00:00:00.000 | 2010 | 1 | 1个

问题是我的日期是2010年1月1日,即使该日期不能小于或等于“ 2009-12-31 23:59:59.999”。但是,如果我将查询更改为使用“
2009-12-31 23:59:59.99 8 ”,则它可以正常运行(不返回2010日期时间)。

这是Bug,还是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

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

在第二个值中,0x018B81FF2591999924 * 60 * 60 * 300 - 1)是自午夜以来的最大滴答数。

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



 类似资料:
  • 问题内容: 我已使用ruby脚本将iso时间戳转换为纪元,我正在解析的文件具有以下时间戳结构: 由于我想保留毫秒,因此我使用了以下Ruby代码将其转换为纪元时间: 但是在python中,我尝试了以下操作: 但是我没有把原定的时间日期倒退, 我想知道这与我的格式化方式有关吗? 问题答案: 用途: 指令仅受支持,而不受。 UPDATE 替代使用,:

  • 问题内容: 我可以通过java.util.Date(milliseconds)在Java中创建类似的Date对象。如何在Python中创建可比对象? 分配一个Date对象,并将其初始化为表示自标准基准时间(即“纪元”)(即GMT 1970年1月1日)以来指定的毫秒数。 问题答案: 只需将其转换为时间戳

  • 问题内容: 我将当前时间(UTC)以纳秒为单位,然后需要以纳秒为单位,然后返回本地时间。我能够将时间缩短到十亿分之一秒,然后再返回到日期字符串,但是当我从字符串转到日期时,时间变得很复杂。 //时间戳正确,但返回的日期不正确 问题答案: 我不明白您为什么要对字符串做任何事情…

  • 问题内容: 我在Oracle 中将MSSTAMP设置 为“带有毫秒的时间戳”,格式:1483228800000。如何将该毫秒时间戳转换为日期格式“ YYYY- MM”,以便获得前几年每月的已完成行数。 我尝试了TO_DATE,CAST,TO_CHAR的不同变体-但无法正常工作。 问题答案: 如果您只需要将自纪元以来的毫秒数转换为日期,则: 哪个输出: 您只需要年月,然后使用或即可。 如果您需要处理

  • 问题内容: 在我可以设置例如 是否有任何符号(%something)以毫秒为单位返回当前时间? 问题答案: 没有完全符合您需要的Log4J符号。 以给定的模式返回当前日期,该模式由(放在方括号之间的模式)定义,但是没有给您以毫秒为单位的时间。 给出自 执行开始以来的 毫秒数。 实现所需目标的一种可能方法是扩展Log4j的行为,这要复杂得多,但是如果绝对必要,请按以下步骤进行: 自定义log4j(编

  • Linux中是否有shell命令来获取以毫秒为单位的时间?