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