首页 > 解决方案 > 来自 SQL Server 的 EPOCH 时间戳

问题描述

我觉得我已经阅读了大量相应的帖子,例如,

将 Epoch 时间戳转换为 sql server(人类可读格式)

&如何将 SQL 服务器时间戳转换为纪元时间戳?

但似乎无法让我的特定用例正常工作。我需要将纪元时间戳转换为正常的日期/时间值。目前,该列是 nvarchar(max) 类型。以下是其中一个日期的示例:

1478563200000

我试图让它看起来像下面这样:

2019-01-14 00:00:00.0000000

我尝试了以下所有操作均未成功,但出现相同的错误消息:

select DATEADD(SS, CONVERT(BIGINT, baddate), '19700101') as gooddate
from table

“将表达式转换为数据类型 int 的算术溢出错误”

我已经尝试了几分钟、几秒钟、几天,所有相同的错误消息,此时我将告诉这些人以不同的格式发送数据。

标签: sql-server

解决方案


尝试

select DATEADD(SS, CONVERT(INT, CONVERT(BIGINT, baddate)/1000), '19700101') as gooddate
from table

DATEADD 需要一个int,而不是一个bigint. 由于您的时间戳以毫秒为单位,因此它不会“适合” int. 如果您通过除以 1000 将毫秒分辨率换成秒分辨率,它将适合整数并让人DATEADD高兴。所以首先我们将 转换NVARCHARBIGINT(为什么NVARCHAR首先存储?),然后除以 1000 然后转换为INT.

另一种选择是在插入时将该值除以 1000(同样,首先将列设为 int)。这将在任何地方节省很多CONVERTs (你可以摆脱它们)并且可能会很好地加速你的查询。再说一次,您甚至可以将该列转换为datetime(或datetime2任何最适合的类型),并在您的查询中一起忽略整个 dateadd/convert 混乱。始终尝试使您的数据广告接近您以后需要的最终数据类型。


编辑:我刚刚意识到你可能会遗漏一个convert

select DATEADD(SS, CONVERT(BIGINT, baddate)/1000, '19700101') as gooddate
from table

这与最初的建议相同,只是这次强制转换int为隐含的。但是在插入时转换数据可能仍然是更好的主意。所以我的帖子的其余部分仍然有效。


推荐阅读