【问题标题】:Convert datetime to epoch time with seconds in SQL Server 2008在 SQL Server 2008 中将日期时间转换为以秒为单位的纪元时间
【发布时间】:2018-01-12 16:05:06
【问题描述】:
SELECT  
    CONVERT(BIGINT, DATEDIFF(ss, '1970-01-01 00:00:00', replogindatetime)) AS login,
    CONVERT(BIGINT, DATEDIFF(ss, '1970-01-01 00:00:00', replogoutdatetime)) AS logout
FROM 
    #Table

RepLoginDateTime & RepLogoutDateTime 是 SQL Server datetime 数据类型中的 2 列,我必须将其转换为纪元时间戳,但出现此错误:

消息 535,第 16 级,状态 0,第 23 行
datediff 函数导致溢出。分隔两个日期/时间实例的日期部分的数量太大。尝试将 datediff 与不太精确的日期部分一起使用。

我使用的是 SQL Server 2008

【问题讨论】:

  • 您想要自纪元以来的秒数?你能用分钟代替吗?
  • 在这里使用 convert 没有意义。 Datediff 总是返回 int。 Datediff 的结果超出 int 范围。所以你得到这个错误
  • 对于毫秒,startdate 和 enddate 之间的最大差异是 24 天 20 小时 31 分钟和 23.647 秒。

标签: sql sql-server datetime


【解决方案1】:

SQL Server 中的DATEDIFF 返回一个int。在 SQL Server 2016 中,您还拥有 DATEDIFF_BIG,它返回 bigint。这意味着,如果您的值对于 int 来说太大了,那么在使用 DATEDIFF 时会出现溢出错误。

然而,让我感到惊讶的是,您在此处出现溢出,因为 1970-01-01 加上 2,147,483,647 秒是 2038-01-19 03:14:07

无论如何,为什么不获取天数,然后是秒数,然后添加:

SELECT CONVERT(BIGINT,DATEDIFF(DAY, '19700101','2038-10-12 12:30:49')) * 86400 +
       DATEDIFF(ss, DATEADD(DAY, DATEDIFF(DAY, 0, '2038-10-12 12:30:49'),0), '2038-10-12 12:30:49')

【讨论】:

    【解决方案2】:

    您必须绕过转换函数并改用 BIGINT。

    DECLARE @Epoch DATETIME = CAST(0 as DATETIME)
    DECLARE @TestDate DATETIME = GETDATE()
    
    DECLARE @DaysPast BIGINT = (SELECT DATEDIFF(DAY, @Epoch,@TestDate))  
    
    DECLARE @TimeOfDayInMilliseconds BIGINT = (SELECT  DATEDIFF(ms, 0, DATEADD(Day, 0 - DATEDIFF(Day, 0, @TestDate), @TestDate)))
    
    SELECT (@DaysPast * 86400000) + @TimeOfDayInMilliseconds
    

    【讨论】:

      猜你喜欢
      • 2014-03-14
      • 2020-05-20
      • 1970-01-01
      • 2013-10-31
      • 2020-09-14
      • 2021-05-26
      • 2013-05-19
      • 1970-01-01
      • 2012-09-06
      相关资源
      最近更新 更多