首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将纪元转换为DateTime SQL Server (超过2038年)

将纪元转换为DateTime SQL Server (超过2038年)
EN

Stack Overflow用户
提问于 2016-05-18 21:06:13
回答 4查看 5.2K关注 0票数 4

如果纪元超过2038年,如何将纪元转换为DateTime SQL Server?

Convert Epoch to DateTime SQL Server中回答将不起作用。

示例:

代码语言:javascript
运行
复制
SELECT DATEADD(ss, 2713795200000 / 1000, '19700101')

2055年12月30日星期四16:00:00 GMT

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2016-05-20 12:40:37

DATEADD函数假定INT作为日期的增量,为了绕过INT的限制,您可以降低纪元的精度,或者执行稍微复杂的代码来保持纪元的精度。

这会将精度降低到分钟:

代码语言:javascript
运行
复制
SELECT DATEADD(MINUTE,@YourEpoch/60/1000, '1/1/1970')

该命令将您的纪元拆分为天和毫秒,然后将它们组合到一个日期时间中

代码语言:javascript
运行
复制
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;

然而,我不太确定为什么第二个解决方案不像我期望的那样精确。

票数 1
EN

Stack Overflow用户

发布于 2021-03-19 03:36:48

在上述响应的基础上,提供的解决方案可以工作,但不能防止尝试转换为SQL server的限制之外的日期。

create function dbo.unixTimestampConversion ( @unixTime bigInt )返回dateTime2(7)作为begin

代码语言:javascript
运行
复制
    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

票数 0
EN

Stack Overflow用户

发布于 2021-09-13 12:01:28

您可以直接将纪元时间分配给datetime (我在SQL Server15.0上尝试过)。虽然它将天数视为自1900-1-1 00:00:00以来的天数,但您必须加上2208988800 (70年中的秒数),然后除以86400(一天中的秒数)。

代码语言:javascript
运行
复制
DECLARE @time DATETIME = (2208988800.0 + [your epoch time in seconds])/86400;

然而,它似乎比给定的纪元晚0.007秒或0.003秒。此外,我不确定这是否比DATEADD()函数更快。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37300536

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档