Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 将历元转换为日期时间_Sql Server_Tsql_Datetime_Epoch - Fatal编程技术网

Sql server 将历元转换为日期时间

Sql server 将历元转换为日期时间,sql-server,tsql,datetime,epoch,Sql Server,Tsql,Datetime,Epoch,在一个表上,我有一个bigint列,该列以微秒的精度存储时间戳,如: 636453251396217655 636453251398405201 636453251592389899 636453251668326820 我必须构建一个脚本,如果该日期早于一周,则该行必须移动到另一个表 我尝试使用以下方法转换为日期: CREATE FUNCTION [dbo].[UNIXToDateTime] (@timestamp bigint) RETURNS datetime AS BE

在一个表上,我有一个bigint列,该列以微秒的精度存储时间戳,如:

636453251396217655
636453251398405201
636453251592389899
636453251668326820
我必须构建一个脚本,如果该日期早于一周,则该行必须移动到另一个表

我尝试使用以下方法转换为日期:

CREATE FUNCTION [dbo].[UNIXToDateTime] (@timestamp bigint)
        RETURNS datetime
AS
BEGIN
        DECLARE @ret datetime

        SELECT @ret = DATEADD(second, @timestamp, '1970/01/01 00:00:00')

        RETURN @ret
END
用起来像:

select dbo.UNIXToDateTime(636453251396217655)
但由于bigint,我的脚本崩溃,因为:

int数据中的表达式转换期间出现算术溢出错误 类型

我可能会失去精度,重要的是日期部分,它是sql过滤器的主要部分

演示:

有一个用于转换历元值的方法:

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;
您可以使用该函数,但只需除以历元值即可。由于您对失真的处理很好,这将非常适合您的需要。例如:

DECLARE @epoch BIGINT = 636453251396217655

SELECT dbo.[fn_EpochToDatetime](@epoch/100000)
有一个用于转换历元值的方法:

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;
您可以使用该函数,但只需除以历元值即可。由于您对失真的处理很好,这将非常适合您的需要。例如:

DECLARE @epoch BIGINT = 636453251396217655

SELECT dbo.[fn_EpochToDatetime](@epoch/100000)

@DavidG的可能副本它们是有效的,从一个实时系统中写下,在@DavidG yep上以微秒为单位检查它们,如问题的第一行所述:-)@IrvinDominin。正如DavidG指出的,您的值不是有效的Unix时间戳。您可以自己在epochconverter.com网站上进行转换。“6”的前导数字对于任何正常日期都是高度可疑的。可能重复的@DavidG它们是有效的,从一个实时系统中写入,在@DavidG yep上以微秒为单位检查它们,如问题的第一行所述:-)@IrvinDominin。正如DavidG指出的,您的值不是有效的Unix时间戳。您可以自己在epochconverter.com网站上进行转换。对于任何正常日期,“6”的前导数字都是高度可疑的。