UNIX与MS SQL的日期时间不一致的时间戳

时间:2017-07-13 06:50:34

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

我目前正在为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

但是当我执行INSERT然后SELECT时,Postgres / MySQL会给我上面说明的正确时间,但是使用Microsoft SQL,我得到以下结果:2017-07-12 06:02:08.917

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

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

1 个答案:

答案 0 :(得分:1)

据我所知,MsSQL DATETIME数据类型有一个奇怪的分辨率,因为毫秒被舍入到0,3或7,所以看起来你已经陷入了其中一个案例。
您可能想要使用DATETIME2数据类型(从SqLServer2008开始,我猜),其分辨率为100ns。
虽然小时差异应取决于服务器时区。