27

我有以下查询:

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

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

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

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

问题是我真的也需要 MILLISECONDS。

4

7 回答 7

40

稍后回复,但可能会有所帮助。在 SQL 2016 中,MS 引入了函数 DATEDIFF_BIG,它将(根据类型大小)溢出大于 29 万年之类的差异。但是 technet 文章与基本 DATEDIFF 具有相同的时差 - https://msdn.microsoft.com/en-us/library/mt628058.aspx

于 2016-04-14T10:03:00.940 回答
28

请参阅https://docs.microsoft.com/en-us/sql/t-sql/functions/datediff-transact-sql?view=sql-server-ver15#return-value

对于毫秒,开始日期和结束日期之间的最大差异是 24 天 20 小时 31 分钟和 23.647秒

如果您需要高于该级别的毫秒数,则需要编写一些自定义内容。

于 2014-11-04T08:08:04.487 回答
14

在 SQL Server 2016 中有一个可用的新函数:DATEDIFF_BIG

它正好解决了溢出问题。

于 2018-11-07T17:14:17.203 回答
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)
于 2014-11-04T08:26:33.753 回答
3

对我来说,两个日期之间有很大的间隔,所以我使用了下面的代码

声明 @timetagInMillsecond bigint=CAST(CAST( cast(@timetag as datetime) -'1970-01-01' AS decimal(38,10))*24*60*60*1000+0.5 as bigint)

这个对我有用 。

于 2017-03-24T12:41:47.987 回答
2

使用 DATEDIFF_BIG 解决溢出问题

datediff 函数导致溢出。分隔两个日期/时间实例的日期部分的数量太大。尝试将 datediff 与不太精确的日期部分一起使用。

SELECT DATEDIFF_BIG( 
    millisecond, 
    SYSDATETIME(), 
    DATEADD(year, 1000, SYSDATETIME()) ) AS 'Milliseconds in 1000 years'; 
于 2021-11-01T06:55:10.030 回答
0

对于 SQL Server 2014,以下工作围绕“int”限制获取“JavaScript Time Epoch”。这假设开始时期本身就是一个日期,它适合导致找到这个问题的本地用例。查询需要适应不具有此属性的特定问题用例。

declare @x as datetime = getdate()

-- epoch_delta_s_to_date * 1000 + day_delta_ms
select
cast(datediff(second, '1970-01-01', cast(@x as date)) as bigint) * 1000
  + cast(datediff(millisecond, cast(@x as date), @x) as bigint)

对于获取“JavaScript Time Epoch”的情况,这仍受 .Y2038 限制datediff(second, '1970-01-01', ..)

于 2020-05-09T20:45:31.227 回答