SQL Server:datediff函数在使用MILLISECOND时导致溢出

Bar*_*ens 17 sql-server date-difference sql-server-2012

我有以下查询:

select CONVERT(varchar(12), DATEADD(MILLISECOND, DateDiff(MILLISECOND, '2014-08-04 10:37:28.713','2014-11-04 08:21:17.723'), 0), 114)
Run Code Online (Sandbox Code Playgroud)

当我执行此操作时,我收到错误:"datediff函数导致溢出.分隔两个日期/时间实例的日期部分的数量太大.尝试使用具有不太精确的日期部分的datediff."

当我将查询更改为以下时,它工作正常:

select CONVERT(varchar(12), DATEADD(SECOND, DateDiff(SECOND, '2014-08-04 10:37:28.713','2014-11-04 08:21:17.723'), 0), 114)
Run Code Online (Sandbox Code Playgroud)

问题是我真的需要MILLISECONDS.

小智 23

稍后回复但可能有所帮助.在SQL 2016 MS中引入了功能D​​ATEDIFF_BIG,它将(根据类型大小)溢出的差异大于290k年.但是,technet文章与DATEDIFF基本相同 - https://msdn.microsoft.com/en-us/library/mt628058.aspx


Mar*_*ont 21

对于毫秒,startdate和enddate之间的最大差异是24天,20小时,31分钟和23.647秒.请参阅http://msdn.microsoft.com/en-us/library/ms189794.aspx

如果你需要毫秒以上的水平,你需要写一些自定义的东西.


t-c*_*.dk 5

您不需要在计算中参考毫秒。

除了溢出之外,这将与您的脚本完全相同:

SELECT CONVERT(varchar(12), 
        CAST('2014-11-04 08:21:17.723' as datetime) - 
        CAST('2014-08-04 10:37:28.713' as datetime)
       , 114)
Run Code Online (Sandbox Code Playgroud)


tom*_*hle 5

在SQL Server 2016中,有一个可用的新功能:DATEDIFF_BIG

它恰好解决了溢出问题。