我觉得我已经读过很多这些相应的帖子,比如
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的算术溢出错误”
我已经尝试了几分钟,几秒钟,几天,所有相同的错误消息,此时我即将告诉这些人以不同的格式发送数据。
尝试
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
s到处(你可以摆脱它们)并可能很好地加快你的查询。然后,您甚至可以将列转换为datetime
(或datetime2
或任何类型最适合),并在查询中完全忽略整个dateadd / convert混乱。始终尝试让您的数据广告接近您稍后所需的最终数据类型。
编辑:我刚刚意识到你可能会留下一个convert
:
select DATEADD(SS, CONVERT(BIGINT, baddate)/1000, '19700101') as gooddate
from table
这与原始建议相同,只是这次对int
的演员是隐含的。但是在插入时转换数据仍然是更好的主意。所以我的帖子的其余部分仍然有效。
使用接受的答案,您可以使用0001到9999年的毫秒数得到正确的结果
here。
declare @x nvarchar(max) = N'1478563200000'
select dbo.UnixTimeToDateTime2(@x)