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

为什么DATEDIFF将23:59.59.999视为第二天?

章威
2023-03-14
问题内容

当我运行以下命令时:

DECLARE @date1 datetime = '2017-12-01 23:59:59.998'
DECLARE @date2 datetime = '2017-12-11 00:00:00.000'
SELECT DATEDIFF(day, @date1, @date2)

我得到了10个预期的结果,因为它只比较了一天的时间

但是,如果我加上一毫秒:

DECLARE @date1 datetime = '2017-12-01 23:59:59.999'
DECLARE @date2 datetime = '2017-12-11 00:00:00.000'
SELECT DATEDIFF(day, @date1, @date2)

我得到9。似乎SQL
Server将23:59.59.999舍入为24:00.00.000,因此在第二天将其舍入,但不会舍入其他任何内容。有什么办法可以防止这种情况?


问题答案:

MS SQL使用4个字节存储1900年1月1日之后的日期。4个字节存储午夜之后的时钟滴答。(滴答是3.3毫秒)

您看到的是溢出。由于数字不能用4个字节表示,因此它将使用第5个字节,从而使日期增加1。

SQL
Server将时间的第二个整数存储为午夜之后的时钟滴答数。一秒包含300个滴答声,因此滴答声等于3.3毫秒(ms)。您可以通过将datetime值转换为binary(8)值并使用substring函数提取每组4个字节来查看天数和时钟滴答的值。然后,图3中的代码将每组4个字节转换为一个整数。

来源:http://www.itprotoday.com/microsoft-sql-server/solving-datetime-
mystery



 类似资料:
  • 问题内容: 有一个很大的材料了有这表明印刷异常的堆栈跟踪是不好的做法。 例如从Checkexp中的RegexpSingleline检查: 可以使用此检查来查找常见的不良做法,例如调用ex.printStacktrace() 但是,我正在努力寻找能够给出正当理由的任何地方,因为肯定可以使堆栈跟踪对于跟踪导致异常的原因非常有用。我知道的事情: 最终用户永远不应看到堆栈跟踪(出于用户体验和安全目的) 生

  • 问题内容: 在我们尝试投射包含以下内容的序列的序列时,如下所示 ,我经常看到错误消息 我知道值不能转换为整数。但是我对这种情况下的抛出感到好奇。它说 float NaN不能转换为整数。 为什么将值视为浮点对象有任何特定的原因?还是这种情况与显示的错误消息有关? 问题答案: 简短的答案是IEEE 754指定为一个值。 至于您应该如何将转换为特定的数值数据类型,我更喜欢在可能的地方使用。以下示例说明了

  • 问题内容: 我正在为某门课程的一些代码编写解释,并且偶然使用了这些单词并且可以互换使用。我决定回过头来修正措辞,但在我的理解上遇到了一个漏洞。 据我了解,子例程是一个如果它不作用于一个类的实例(其作用仅限于其显式输入/输出),并且是一个如果它作用于一个类的实例(它可能带有消除导致实例不纯的副作用)。 这里有一个很好的讨论主题。请注意,根据接受的答案的定义,静态实际上应该是一个函数,因为永远不会隐式

  • 问题内容: 我知道它 确实 将’|’视为,但这并不能告诉我 为什么 会这样。据我了解的SQL规范,“ |”与-是一个有效的数据,而另一个则表明缺少相同的信息。 随意推测,但请说明是否是这种情况。如果有Oracle的任何人可以对此发表评论,那就太好了! 问题答案: 我相信答案是甲骨文非常老。 早在SQL标准出现以前,Oracle就做出了以下设计决定:/列中的空字符串是并且只有一种NULL感觉(有一些

  • 在C中不使用sizeof查找数组大小的问题中,asker将int数组视为int数组的数组,方法是获取地址,然后指定数组索引为1:

  • 当我尝试按值降序排序时,我的SQL表是否正确,但如果它看到例如“1000”,它总是将其放在中间?例如: 这甚至发生时,我引用它在龙头(我使用它的插件)它输出相同的方式 这是我在插件中的调用方式: 我知道这并不完美,因为我目前只是在学习/实验数据库,但我主要是想寻求帮助,了解为什么SQL以这种方式输出 我认为图像被窃听了,但链接应该可以工作 编辑:任何长度超过1个字符的数字也是同样的问题