Sql 奇怪的datetime和dateime2毫秒比较问题
我一直面临着datetime和datime2的典型比较问题。我无法理解为什么在1和2中没有返回相同的结果。我已经读过关于如何从msdn存储datetime值,并基于该值为1-它应该返回等于993的值,将四舍五入为993,并与99300000进行比较 结果应该是平等的。我正在使用SQL Server 2014 如果有人有同样的想法,请告诉我 (一) (三)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
和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]