【问题标题】:UNIX Timestamp to Datetime inconsistencies with MS SQLUNIX 时间戳到日期时间与 MS SQL 不一致
【发布时间】:2017-12-17 19:18:45
【问题描述】:

我目前为BigSense 开发,我们支持三种数据库后端:MySQL、Postgres 和 MS SQL。最近我在编写测试用例时遇到了一个有趣的时间/查询问题。

给定以下 UNIX 时间戳:1499839328918

并给出以下数据类型:

MySQL: DATETIME(6)
Postgres: TIMESTAMP WITHOUT TIME ZONE
Microsoft SQL: DATETIME

我使用以下函数将 UNIX 时间戳转换为 java.sql.Timestamp

  def timestampToDate(unixTimeStamp: String) : java.sql.Timestamp = new java.sql.Timestamp(unixTimeStamp.toLong)

在 Scala REPL 中,这似乎给了我以下日期:

scala> timestampToDate("1499839328918")
res0: java.sql.Timestamp = 2017-07-12 06:02:08.918

但是,当我执行 INSERTSELECT 时,Postgres/MySQL 会给我上述正确的时间,但是使用 Microsoft SQL,我得到以下信息:2017-07-12 06:02:08.917

所以它会延迟 1/100 秒,通常我不会在意,但我希望我的自动化测试能够通过,而不必捏造时间戳的 100 秒位置。我已经尝试了其他几个时间戳,它们似乎都不适用于 MS SQL。这里发生了什么?是 Microsoft JDBC 驱动程序的问题还是 MS SQL 做了奇怪的时间戳舍入?

编辑我正在使用"net.sourceforge.jtds" % "jtds" % "1.3.1",

【问题讨论】:

  • 它似乎关闭了将近 7 个小时?
  • 嗯,你是对的。我只是在看毫秒,并没有注意到时间已经过去了。我会进一步调查/谢谢。
  • 所有服务器的时区是否相同?或者可能是触发器?
  • @ScaryWombat 原来我从错误的窗口复制/粘贴。更新了时间戳。
  • 你真的需要毫秒精度吗?作为一个软糖,你可以精确到一秒 - 如果@ugo 是正确的

标签: java sql-server scala timestamp unix-timestamp


【解决方案1】:

据我所知,MsSQL DATETIME 数据类型具有奇怪的分辨率,因为毫秒四舍五入为 0、3 或 7,因此您似乎陷入了其中一种情况。
您可能想要使用分辨率为 100ns 的 DATETIME2 数据类型(我猜是从 SqlServer2008 开始)。
虽然小时差异应取决于服务器时区。

【讨论】:

  • 您对此有什么参考吗?
猜你喜欢
  • 2010-10-02
  • 1970-01-01
  • 2011-02-26
  • 2013-06-03
  • 1970-01-01
  • 1970-01-01
  • 2021-03-31
  • 2019-06-16
相关资源
最近更新 更多