将纪元转换为日期时间
Convert epoch to datetime
在 table 上,我有一个 bigint 列,它存储具有微秒精度的时间戳,例如:
636453251396217655
636453251398405201
636453251592389899
636453251668326820
我必须构建一个脚本,如果该日期早于一周,则该行必须移至另一个 table。
我尝试使用以下方法转换为日期:
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,我的脚本崩溃了,因为:
Arithmetic overflow error during expression conversion in int data
type
我可能会失去精度,重要的是日期部分,它是 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)
在 table 上,我有一个 bigint 列,它存储具有微秒精度的时间戳,例如:
636453251396217655
636453251398405201
636453251592389899
636453251668326820
我必须构建一个脚本,如果该日期早于一周,则该行必须移至另一个 table。
我尝试使用以下方法转换为日期:
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,我的脚本崩溃了,因为:
Arithmetic overflow error during expression conversion in int data type
我可能会失去精度,重要的是日期部分,它是 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)