我有一个奇怪的sybase行为,我不明白。
我有一个表( MY_TABLE ),其中有几列 smalldatetime 。为了便于说明,我们假设下表和数据:
MY_TABLE||ID |TS_INIT |TS_LASTCHANGE |MY_TEXT |
||4711|3/31/2013 12:00:00 AM|3/31/2013 3:00:00 AM|someText|
TS_INIT 和 TS_LASTCHANGE 的类型为 smalldatetime 。
执行以下语句时,我得到上述结果:
SELECT ID, TS_INIT, TS_LASTCHANGE MY_TEXT
FROM MY_TABLE
WHERE ID = 4711
go
我的客户端在UTC + 1(柏林)中运行,并启用了夏令时(DST)。 我不确定服务器在什么时区运行以及是否启用了DST。
当我执行此操作时(注意它是03:00h):
SELECT ID, TS_INIT, TS_LASTCHANGE MY_TEXT
FROM MY_TABLE
WHERE ID = 4711 AND TS_LASTCHANGE = "2013-03-31 03:00:00:000"
go
我得到 NO 结果,但是当我执行此操作时(注意这次是02:00h):
SELECT ID, TS_INIT, TS_LASTCHANGE MY_TEXT
FROM MY_TABLE
WHERE ID = 4711 AND TS_LASTCHANGE = "2013-03-31 02:00:00:000"
go
我再次得到上面的结果,说TS_LASTCHANGE是
3/31/2013 3:00:00 AM
请注意,即使我在02:00h查询,结果也会打印03:00h。
为什么第一个查询没有返回结果,即使应匹配,为什么第二个查询返回结果,即使不匹配?
另请注意 3/31/2013 3:00:00 AM 是夏令时的第一个时刻(至少在2013年)和 2013年3月31日2:00 :00 AM 永远不应该存在,因为从冬季到夏季过渡时,时钟从 01:59:59 切换到 03:00:00 (根据this网站)。
数据库:Adaptive Server Enterprise V15.0.3
客户:Aqua Data Studio V16.0.5
修改 在查询白色时,TS_INIT一切正常(只有 3/31/2013 12:00:00 AM 的结果)
答案 0 :(得分:3)
Aqua Data Studio是用Java编写的 您遇到的问题与Java知道时区有关,而数据库在存储日期和时间时没有时区概念。当时间从数据库返回时,数据库的JDBC驱动程序将其置于Java日期,并假设时区不相关。当您尝试显示JVM认为无效的时间时会发生此问题,因此会显示一个有效日期,这基本上会将时间推迟一个小时。 2015年的夏令时从3月8日凌晨2点开始,其中一行包含根据JVM无效的日期。
这是Java的一个已知设计问题,他们正试图用JSR-310来解决这个问题,以便包含在Java SE 8中。这样,他们将拥有LocalDate,OffsetDate和ZonedDate。你可以在这里阅读更多相关信息......
https://today.java.net/pub/a/today/2008/09/18/jsr-310-new-java-date-time-api.html#jsr-310-datetime-concepts https://jcp.org/en/jsr/detail?id=310 http://docs.google.com/View?id=dfn5297z_8d27fnf
解决方法强>
唯一的解决方法是通过将JVM中的时区设置为GMT来欺骗JVM。如果在Windows上运行ADS 16,并且使用桌面上的快捷方式图标(运行datastudio.exe)启动ADS,则需要修改文件夹中的datastudio.ini文件。为vmarg.5 = -Duser.timezone = gmt
此链接说明了查找数据studio.ini的位置 https://www.aquaclusters.com/app/home/project/public/aquadatastudio/wikibook/Documentation14/page/50/Launcher-Memory-Configuration#windows
完成更改后,重新启动ADS。然后转到Help-> About-> System:并仔细检查您的user.timezone设置并确保它是GMT。然后尝试一下。 由于上述变化,在涉及时区的应用中可能存在副作用,例如,在表数据编辑器中 - >插入当前日期和时间,这将显示GMT时间...所以会有一个偏移。