Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server T-SQL中DATEFDIFF的不精确性_Sql Server_Tsql - Fatal编程技术网

Sql server T-SQL中DATEFDIFF的不精确性

Sql server T-SQL中DATEFDIFF的不精确性,sql-server,tsql,Sql Server,Tsql,对我来说,这看起来很粗糙。也许它与浮点数有关,也许不是,但我认为这些算不上边缘情况,不足以证明这一点: select datediff(s, '2014-10-28 13:54:55.230', '2014-10-28 13:54:55.998') -- 0 select datediff(s, '2014-10-28 13:54:55.230', '2014-10-28 13:54:55.999') -- 1 select datediff(ms, '2014-10-28 13:54:55.2

对我来说,这看起来很粗糙。也许它与浮点数有关,也许不是,但我认为这些算不上边缘情况,不足以证明这一点:

select datediff(s, '2014-10-28 13:54:55.230', '2014-10-28 13:54:55.998') -- 0
select datediff(s, '2014-10-28 13:54:55.230', '2014-10-28 13:54:55.999') -- 1
select datediff(ms, '2014-10-28 13:54:55.230', '2014-10-28 13:54:57.229') -- 2000
select datediff(ms, '2014-10-28 13:54:55.230', '2014-10-28 13:54:57.230') -- 2000
这看起来根本不像合法的舍入。以前两个案例为例。秒数部分保持不变,因此它不能只看秒数而忽略毫秒数。但同时,以毫秒为单位的差异是
768
769
之间的差异,而不是
499
500
之间的差异。最后两种情况甚至没有留下任何舍入的余地,然而SQL只是“提出”了以毫秒为单位的差异是相同的想法。最后,就时钟上的时间而言,前两个案例正在接近下一秒,而就已经过期的时间而言,后两个案例只是在接近下一秒

有谁能解释一下,在这之后,我怎么会再次信任
DATEDIFF()
<代码>日期时间四舍五入到最接近的.000、.003或.007秒

datetime2
有,但系统仍然可以将低于该精度阈值的值视为相同的值

尝试运行以下命令:

select 1 where cast('2014-10-28 13:54:55.998' as datetime) = cast('2014-10-28 13:54:55.997' as datetime) --1

select 1 where cast('2014-10-28 13:54:55.998' as datetime) = cast('2014-10-28 13:54:55.999' as datetime) --no results

select 1 where cast('2014-10-28 13:54:57.229' as datetime) = cast('2014-10-28 13:54:57.230' as datetime) --1

select 1 where cast('2014-10-28 13:54:55.998' as datetime2) = cast('2014-10-28 13:54:55.997' as datetime2) --no results

select 1 where cast('2014-10-28 13:54:55.998' as datetime2) = cast('2014-10-28 13:54:55.999' as datetime2) --no results

select 1 where cast('2014-10-28 13:54:57.229' as datetime2) = cast('2014-10-28 13:54:57.230' as datetime2) --no results

datepart很重要,如下所示:

select datediff(s, '2014-10-28 13:54:55.230', '2014-10-28 13:54:55.998')--0
select datediff(ms, '2014-10-28 13:54:55.230', '2014-10-28 13:54:55.998') -- 768
select datediff(ms, '2014-10-28 13:54:55.230', '2014-10-28 13:54:57.230')--2000
select datediff(mcs, '2014-10-28 13:54:55.230', '2014-10-28 13:54:57.230')--2000000

我得到了第三个select
selectdatediff(ms,'2014-10-2813:54:55.230','2014-10-2813:54:57.229')--1999
请回答这个问题。您运行的是什么版本。我已经在MSSQL server 2012上进行了测试。这里也一样。MSSQL Server 2012.Datediff“返回在指定的开始日期和结束日期之间跨越的指定日期部分边界的计数(有符号整数)。”添加了强调。999将进入下一秒。这不是datediff,你不应该相信它(好吧,一旦你彻底阅读了文档),而是datetime。如果你想要更好的准确性,非常简单:使用datetime2。