我觉得我已经阅读了很多此类相关文章,
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数据类型的算术溢出错误”
我已经尝试了几分钟,几秒钟,几天,所有相同的错误消息,并且在这一点上,我要告诉大家以不同的格式发送数据。
答案 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)