sql-server - 来自 SQL Server 的 EPOCH 时间戳
问题描述
我觉得我已经阅读了大量相应的帖子,例如,
将 Epoch 时间戳转换为 sql server(人类可读格式)
但似乎无法让我的特定用例正常工作。我需要将纪元时间戳转换为正常的日期/时间值。目前,该列是 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
为隐含的。但是在插入时转换数据可能仍然是更好的主意。所以我的帖子的其余部分仍然有效。
推荐阅读
- css - jQuery 可排序项目浮动右排序不平滑问题
- apache-spark - 使用 (Py)Spark 对直方图进行聚类以减少数据
- javascript - 将未设置的属性设置为函数中的默认属性?
- assembly - 为什么一个由 Brainfuck 创建的程序在汇编编译器中崩溃?
- java - Spark SQL:在数组值上使用 collect_set?
- php - 如何将用户重定向到他们的特定子文件夹?
- ionic-framework - 我在 ionic 3 应用程序中显示媒体时遇到问题
- azure - 使用队列而不是主题和订阅有什么意义吗?
- javascript - Vuetify v-select 值不返回键
- python - 为什么在使用 Gmail API python 导入电子邮件时 mime 部分变为“0”?