来自SQL Server的EPOCH时间戳

问题描述 投票:0回答:2

我觉得我已经读过很多这些相应的帖子,比如

converting Epoch timestamp to sql server(human readable format)

How do I convert a SQL server timestamp to an epoch timestamp?

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

1478563200000

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

2019-01-14 00:00:00.0000000

我尝试了以下相同的错误消息没有成功:

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

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

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

sql-server
2个回答
0
投票

尝试

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

DATEADD期待一个int,而不是bigint。由于您的时间戳以毫秒为单位,因此它不会“适合”在int中。如果你用第一个分辨率换算毫秒分辨率除以1000它将适合一个整数并让DATEADD高兴。所以首先我们将NVARCHAR转换为BIGINT(为什么首先存储为NVARCHAR?),然后除以1000然后转换为INT

另一个选择是在插入时将值除以1000(同样,首先使列成为int)。这将节省大量的CONVERTs到处(你可以摆脱它们)并可能很好地加快你的查询。然后,您甚至可以将列转换为datetime(或datetime2或任何类型最适合),并在查询中完全忽略整个dateadd / convert混乱。始终尝试让您的数据广告接近您稍后所需的最终数据类型。


编辑:我刚刚意识到你可能会留下一个convert

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

这与原始建议相同,只是这次对int的演员是隐含的。但是在插入时转换数据仍然是更好的主意。所以我的帖子的其余部分仍然有效。


0
投票

使用接受的答案,您可以使用0001到9999年的毫秒数得到正确的结果

here

declare @x nvarchar(max) = N'1478563200000'

select dbo.UnixTimeToDateTime2(@x)
© www.soinside.com 2019 - 2024. All rights reserved.