【问题标题】:EPOCH timestamp from SQL Server来自 SQL Server 的 EPOCH 时间戳
【发布时间】:2019-02-27 20:04:55
【问题描述】:

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

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

我已经尝试过几分钟、几秒钟、几天,所有相同的错误消息,此时我要告诉他们以不同的格式发送数据。

【问题讨论】:

  • 您的问题是您需要的Convert(BIGINT....)int。转换为bigint,然后除以1000(以ms 分辨率换取s 分辨率),然后转换为int。为什么首先是nvarchar(max) 类型的列?为什么不是数字类型(...比如int)?
  • table 中的baddate 的值是多少?你能举个例子吗?也许放在 rextester.com 的墙上?
  • @DavidG 我从来没有说过 BIGINT 不是数字类型,我说为什么 column 是 nvarchar 类型(它不是数字类型)。
  • @DavidG 是的,确实如此;虽然我在意识到为什么使用 bigint 而不是 int (时间戳以毫秒为单位)后更改了前两句话。关于类型的部分仍然存在并且没有改变。

标签: sql-server


【解决方案1】:

试试

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 的强制转换是隐式的。但是在插入时转换数据可能仍然是更好的主意。所以我的帖子的其余部分仍然有效。

【讨论】:

  • Dang,只需要切换 bigint。我确实同意 NVARCHAR 中的列处理起来有点痛苦,但最终我相信这与更新插入记录的过程有关。它来自外部供应商,所以有点超出我的范围。
  • 请注意,这只适用于 1902 到 2038 年之间的年份。
【解决方案2】:

使用公认的答案,您可以获得毫秒级的正确结果,适用于 0001 到 9999 年

here.

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

select dbo.UnixTimeToDateTime2(@x)

【讨论】:

    猜你喜欢
    • 2017-02-24
    • 1970-01-01
    • 2017-05-29
    • 2011-04-23
    • 2016-02-13
    • 2017-08-29
    • 1970-01-01
    • 2014-06-10
    相关资源
    最近更新 更多