毫秒级的 Unix 时间戳,将其转换为日期时间格式,报错,“将 expression 转换为数据类型 int 时出现算术溢出错误”

如果您有一个时间戳值为 1689217823000,表示毫秒级的 Unix 时间戳,您可以将其转换为日期时间格式。在 SQL Server 中,可以使用 DATEADD 和 CONVERT 函数来进行转换。
以下是将该时间戳值转换为日期时间格式的步骤:
DECLARE @timestamp bigint = 1689217823000;
DECLARE @datetime datetime;

SET @datetime = DATEADD(ms, @timestamp, '1970-01-01T00:00:00');
SET @datetime = DATEADD(HOUR, DATEDIFF(HOUR, GETUTCDATE(), GETDATE()), @datetime); -- 考虑到时区差异

SELECT @datetime AS converted_datetime;

在这个示例中,我们首先声明一个变量 @timestamp 并将其设置为时间戳值。然后,使用 DATEADD 函数将毫秒级的时间戳与 Unix 时间戳的起始日期(1970年1月1日)相加,得到转换后的日期时间值。
为了考虑到时区差异,我们还使用了 DATEADD 和 DATEDIFF 函数来调整日期时间值,确保其与当前时区所处的时间一致。
最后,通过 SELECT 语句返回转换后的日期时间值 @datetime。
请注意,时区是一个重要的因素,确保在转换过程中考虑到适当的时区调整。您可以根据您的实际时区情况进行相应的调整。

执行以上示例,报错,

“将 expression 转换为数据类型 int 时出现算术溢出错误”,如何解决?

让我们尝试另一种方法来解决这个问题。

1.首先,将时间戳值转换为 bigint 类型。假设您的时间戳值为 1689217823000:

DECLARE @timestamp bigint = 1689217823000;


2.然后,将转换后的时间戳值除以 1000,以获得秒级的时间戳:

SET @timestamp = @timestamp / 1000;


3.接下来,将转换后的秒级时间戳值添加到起始日期(1970年1月1日),以获得相应的日期时间值:

DECLARE @datetime datetime = DATEADD(ss, @timestamp, '1970-01-01T00:00:00');


4.最后,在考虑到时区差异的情况下,可以调整日期时间值。根据您所在的时区,可以使用以下代码来进行调整:

SET @datetime = DATEADD(HOUR, DATEDIFF(HOUR,GETUTCDATE(),CURRENT_TIMESTAMP), @datetime);

请注意,这里假设您所在的时区是当前系统时区。如果您的需求不是基于当前时区,而是根据特定的时区进行调整,则需要相应地修改上述代码。
最后,您可以使用 SELECT 语句检查转换后的日期时间值:
SELECT @datetime as converted_datetime;

此方法应该可以成功将时间戳值转换为日期时间格式,而不会出现算术溢出错误。

猜你喜欢

转载自blog.csdn.net/qq1507171150/article/details/131793428