如何在 SQL Server 中将 Unix 时间戳转换为日期/时间值
发布于
在SQL Server中,我们可以使用以下方法根据给定的Unix时间戳返回日期和时间。
Unix 时间戳(也称为 Unix 纪元时间、Unix 时间或 POSIX 时间)是自 1970 年 1 月 1 日星期四 00:00:00(协调世界时 (UTC) 以来经过的秒数。
示例
下面是将 Unix 时间戳转换为日期/时间值的示例:
SELECT DATEADD(s, 1860935119, '1970-01-01');
输出:
2028-12-20 14:25:19.000在本例中,unix 时间戳1860935119,转换为日期和时间 2028-12-20 14:25:19.000。
当前日期/时间
下面是一个使用基于当前日期/时间的 Unix 时间戳的示例:
SELECT DATEADD(s, DATEDIFF(s, '1970-01-01', GETUTCDATE()), '1970-01-01');
输出:
2022-04-18 00:31:46.000请注意,这是多余的,因为我们本可以执行以下操作:
SELECT GETUTCDATE();
更大的 Unix 时间戳
当面对较大的 Unix 时间戳值时,如下所示:
SELECT DATEADD(s, 1867914562715876900, '1970-01-01');
我们可能会收到这样的溢出错误:
Msg 8115, Level 16, State 2, Line 1 Arithmetic overflow error converting expression to data type int.
这是因为 Unix 时间戳值大于整数可以容纳的值。此 Unix 时间戳包含纳秒精度,并且对于整数来说位数过多。
我们有几个选项来处理这个问题。一种选择是降低精度:
DECLARE @ts bigint = 1867914562715876900;
SELECT DATEADD(s, CONVERT(int, LEFT(@ts, 10)), '1970-01-01');
输出:
2029-03-11 09:09:22.000在这里,我们使用函数只返回前十位数字,以及返回整数的函数。LEFT()CONVERT()
如果我们不想降低精度,我们可以做这样的事情:
DECLARE @ts bigint = 1867914562715876900;
SELECT DATEADD(
ns,
@ts % 1000000000,
DATEADD( s, @ts / 1000000000, CAST('1970-01-01' as datetime2(7)) )
);
输出:
2029-03-11 09:09:22.7158769