2017-11-11 142 views
0

桌子上我有一个存储时间戳与微秒级精度像BIGINT列:转换时期为datetime

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数据中的表达式转换 type

我可以失去精度,重要的是日期部分是SQL过滤器的主要部分。

演示:http://sqlfiddle.com/#!6/24f05/1

+0

[转换Unix纪元时间戳TSQL日期时间](https://stackoverflow.com/questions/14507649/convert-unix-epoch-timestamp-to-tsql-datetime) – Joe

+0

可能的复制@ DavidG他们是有效的,从一个实时系统写的高精度检查他们在https://www.epochconverter.com/ –

+0

@DavidG yep,在微秒,如问题的第一行所述:-) –

回答

1

有一个answer here与时代价值转换:

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)