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
答案 0 :(得分:0)
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