Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.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 奇怪的datetime和dateime2毫秒比较问题_Sql_Sql Server_Datetime_Milliseconds_Datetime2 - Fatal编程技术网

Sql 奇怪的datetime和dateime2毫秒比较问题

Sql 奇怪的datetime和dateime2毫秒比较问题,sql,sql-server,datetime,milliseconds,datetime2,Sql,Sql Server,Datetime,Milliseconds,Datetime2,我一直面临着datetime和datime2的典型比较问题。我无法理解为什么在1和2中没有返回相同的结果。我已经读过关于如何从msdn存储datetime值,并基于该值为1-它应该返回等于993的值,将四舍五入为993,并与99300000进行比较 结果应该是平等的。我正在使用SQL Server 2014 如果有人有同样的想法,请告诉我 (一) (三) datetime和datetime2具有不同的内部存储格式和分辨率 datetime 2使用0.0000001秒/时间单位(时间计数器的增量

我一直面临着datetime和datime2的典型比较问题。我无法理解为什么在1和2中没有返回相同的结果。我已经读过关于如何从msdn存储datetime值,并基于该值为1-它应该返回等于993的值,将四舍五入为993,并与99300000进行比较 结果应该是平等的。我正在使用SQL Server 2014

如果有人有同样的想法,请告诉我

(一)

(三)


datetime
datetime2
具有不同的内部存储格式和分辨率

datetime 2
使用
0.0000001
秒/时间单位(时间计数器的增量),而
datetime
使用
0.00333


0.9970000
不能表示为
0.00333
的整数倍,因此在比较两种表示方式时,示例中的值将不匹配。

datetime
datetime2
具有不同的内部存储格式和分辨率

datetime 2
使用
0.0000001
秒/时间单位(时间计数器的增量),而
datetime
使用
0.00333


0.9970000
不能表示为
0.00333
的整数倍,因此在比较这两种表示方式时,示例中的值将不匹配。

问题在于SQL Server正在隐式转换以进行比较,并且正在更改值。显式强制转换为Datetime,您应该会得到预期的结果

这有助于显示现在幕后发生的导致意外结果的事情:

declare @dt2 datetime2(7) = '2018-06-25 16:46:38.9930000'
declare @dt datetime
set @dt = @dt2

SELECT
        @dt2 AS [Datetime2 value]
    ,   @dt AS [Datetime value]
    ,   CONVERT(DATETIME2,@dt) AS [Datetime converted to Datetime2]
    ,   CONVERT(DATETIME2,@dt2) AS [Datetime2 converted to Datetime2]
    ,   CONVERT(DATETIME,@dt) AS [Datetime converted to Datetime]
    ,   CONVERT(DATETIME,@dt2) AS [Datetime2 converted to Datetime]

问题在于SQL Server隐式强制转换以进行比较,这会更改值。显式强制转换为Datetime,您应该会得到预期的结果

这有助于显示现在幕后发生的导致意外结果的事情:

declare @dt2 datetime2(7) = '2018-06-25 16:46:38.9930000'
declare @dt datetime
set @dt = @dt2

SELECT
        @dt2 AS [Datetime2 value]
    ,   @dt AS [Datetime value]
    ,   CONVERT(DATETIME2,@dt) AS [Datetime converted to Datetime2]
    ,   CONVERT(DATETIME2,@dt2) AS [Datetime2 converted to Datetime2]
    ,   CONVERT(DATETIME,@dt) AS [Datetime converted to Datetime]
    ,   CONVERT(DATETIME,@dt2) AS [Datetime2 converted to Datetime]


日期时间并不精确地使用0.00333秒。它有三位精度,第三位限制为
0
3
7
中的一位,但在某种程度上,行为似乎已经发生了变化,即在概念上是否这样对待它。@MartinSmith:不确定你在这里的意思。datetime2是在SQL Server 2008中引入的。我不认为datetime或datetime2从那时起在内部发生了变化(尽管这当然是可能的),它们在内部的存储方式与此无关。似乎发生了变化的是,在转换日期时间时,先前表示为
0.003
的日期时间在概念上是否被视为仅
0.003
0.0033333…
。这是一个什么是正确的语义行为的问题,与它们在内部的存储方式是正交的。它有三位精度,第三位限制为
0
3
7
中的一位,但在某种程度上,行为似乎已经发生了变化,即在概念上是否这样对待它。@MartinSmith:不确定你在这里的意思。datetime2是在SQL Server 2008中引入的。我不认为datetime或datetime2从那时起在内部发生了变化(尽管这当然是可能的),它们在内部的存储方式与此无关。似乎发生了变化的是,在转换日期时间时,先前表示为
0.003
的日期时间在概念上是否被视为仅
0.003
0.0033333…
。这是一个什么是正确的语义行为的问题,与它们在内部的存储方式是正交的。所以我已经运行了这个问题,不知道您的观点是什么。它返回这个。你是说尾随的零是重要的吗?@MartinSmith我是说他的SQL隐式地将DATETIME转换为DATETIME2,所以2018-06-25 16:46:38.993变成2018-06-25 16:46:38.9933333.Hmmm,这不是我看到的,但我模糊地记得其中有一些突破性的变化area@MartinSmith如果有帮助的话,我的SQL Server版本是14.0.1000.169,我想我在这里读到了有关更改的内容,但是当我点击链接到那里的KB文章时,我没有看到讨论的案例。我发布的截图来自
12.0.2569.0
。OP说他们是在2014年,所以我已经运行了,不知道你在说什么。它返回这个。你是说尾随的零是重要的吗?@MartinSmith我是说他的SQL隐式地将DATETIME转换为DATETIME2,所以2018-06-25 16:46:38.993变成2018-06-25 16:46:38.9933333.Hmmm,这不是我看到的,但我模糊地记得其中有一些突破性的变化area@MartinSmith如果有帮助的话,我的SQL Server版本是14.0.1000.169,我想我在这里读到了有关更改的内容,但是当我点击链接到那里的KB文章时,我没有看到讨论的案例。我发布的截图来自
12.0.2569.0
。OP说他们在20141和2上都对我的结果相同吗1和2都对我的结果相同吗
declare @dtest4 datetime2(7)
set @dtest4 = '2018-06-25 16:46:38.9900000'

declare @dtest5 datetime
set @dtest5 = '2018-06-25 16:46:38.990'

if @dtest4 = @dtest5
    print 'datetime2 and datetime equal'
declare @dt2 datetime2(7) = '2018-06-25 16:46:38.9930000'
declare @dt datetime
set @dt = @dt2

SELECT
        @dt2 AS [Datetime2 value]
    ,   @dt AS [Datetime value]
    ,   CONVERT(DATETIME2,@dt) AS [Datetime converted to Datetime2]
    ,   CONVERT(DATETIME2,@dt2) AS [Datetime2 converted to Datetime2]
    ,   CONVERT(DATETIME,@dt) AS [Datetime converted to Datetime]
    ,   CONVERT(DATETIME,@dt2) AS [Datetime2 converted to Datetime]