在SQL Server 2008中将datetime转换为纪元时间,秒数

时间:2018-01-12 16:05:06

标签: sql sql-server datetime

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列,我必须将其转换为纪元时间戳,但我收到此错误:

  

Msg 535,Level 16,State 0,Line 23
  日期函数导致溢出。分隔两个日期/时间实例的日期部分数量太大。尝试使用具有不太精确的日期部分的datediff。

我正在使用SQL Server 2008

2 个答案:

答案 0 :(得分:0)

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')

答案 1 :(得分:0)

您必须绕过转换函数并改为使用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