来自SQL Server的EPOCH时间戳

时间:2019-02-26 00:13:04

标签: sql-server

我觉得我已经阅读了很多此类相关文章,

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数据类型的算术溢出错误”

我已经尝试了几分钟,几秒钟,几天,所有相同的错误消息,并且在这一点上,我要告诉大家以不同的格式发送数据。

2 个答案:

答案 0 :(得分: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)。这样可以在各处节省大量CONVERT(您可以全部删除),并且可能会很好地加快查询速度。再一次,您甚至可以将列转换为datetime(或datetime2或最适合的类型),而将查询中的整个dateadd / convert混乱在一起。始终尝试使数据广告接近您以后需要的最终数据类型。


编辑:我刚刚意识到您可能可以省略一个convert

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

这与原始建议相同,只是这一次对int的强制转换是隐式的。但是插入时转换数据可能仍然是更好的主意。因此,我的其余帖子仍然有效。

答案 1 :(得分:0)

使用可接受的答案,您可以获得以毫秒为单位的正确结果,该结果适用于从0001到9999的年份

here

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

select dbo.UnixTimeToDateTime2(@x)