转换时期为datetime
问题描述:
桌子上我有一个存储时间戳与微秒级精度像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过滤器的主要部分。
答
有一个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)
[转换Unix纪元时间戳TSQL日期时间](https://stackoverflow.com/questions/14507649/convert-unix-epoch-timestamp-to-tsql-datetime) – Joe
可能的复制@ DavidG他们是有效的,从一个实时系统写的高精度检查他们在https://www.epochconverter.com/ –
@DavidG yep,在微秒,如问题的第一行所述:-) –