如果纪元超过2038年,如何将纪元转换为DateTime SQL Server?
在Convert Epoch to DateTime SQL Server中回答将不起作用。
示例:
SELECT DATEADD(ss, 2713795200000 / 1000, '19700101')
2055年12月30日星期四16:00:00 GMT
发布于 2016-05-20 12:40:37
DATEADD函数假定INT作为日期的增量,为了绕过INT的限制,您可以降低纪元的精度,或者执行稍微复杂的代码来保持纪元的精度。
这会将精度降低到分钟:
SELECT DATEADD(MINUTE,@YourEpoch/60/1000, '1/1/1970')
该命令将您的纪元拆分为天和毫秒,然后将它们组合到一个日期时间中
CREATE FUNCTION [dbo].[fn_EpochToDatetime] (@Epoch BIGINT)
RETURNS DATETIME
AS
BEGIN
DECLARE @Days AS INT, @MilliSeconds AS INT
SET @Days = @Epoch / (1000*60*60*24)
SET @MilliSeconds = @Epoch % (1000*60*60*24)
RETURN (SELECT DATEADD(MILLISECOND, @MilliSeconds, DATEADD(DAY, @Days, '1/1/1970')))
END;
然而,我不太确定为什么第二个解决方案不像我期望的那样精确。
发布于 2021-03-19 03:36:48
在上述响应的基础上,提供的解决方案可以工作,但不能防止尝试转换为SQL server的限制之外的日期。
create function dbo.unixTimestampConversion ( @unixTime bigInt )返回dateTime2(7)作为begin
declare
@output dateTime2(7)
, @days int
, @ms int
, @x int = (1000 * 60 * 60 * 24)
;
set @days = @unixTime / @x
;
set @ms = @unixTime % @x
;
if (@unixTime < 32503593600000 and @unixTime > -2208988800000)
begin
set @output = dateAdd (millisecond, @ms, dateAdd (day, @days, '1/1/1970'))
;
end
;
else if (@unixTime <= -2208988800000)
begin
set @output = '1/1/1900'
;
end
;
else if (@unixTime >= 32503593600000)
begin
set @output = '12/31/2999'
;
end
;
return @output
;
end
;
发布于 2021-09-13 12:01:28
您可以直接将纪元时间分配给datetime (我在SQL Server15.0上尝试过)。虽然它将天数视为自1900-1-1 00:00:00以来的天数,但您必须加上2208988800 (70年中的秒数),然后除以86400(一天中的秒数)。
DECLARE @time DATETIME = (2208988800.0 + [your epoch time in seconds])/86400;
然而,它似乎比给定的纪元晚0.007秒或0.003秒。此外,我不确定这是否比DATEADD()
函数更快。
https://stackoverflow.com/questions/37300536
复制相似问题