jdbc - 来自sql数据库的日期时间结果在clojure jdbc中不相同

标签 jdbc clojure firebird jaybird

我在使用 jdbc 的数据库(firebird)中遇到时间戳问题

数据库中的数据

timestamp 1994-10-12T00:00:00.000000000-00:00

我用 python 测试,结果在数据库中是相同的,但是当我使用 jdbc(clojure) 时

result is 1994-10-11T17:00:00.000000000-00:00

我认为这取决于时区(我在 GMT+7)

如何解决?

谢谢。

这段代码

(ns test.core
  (:require [clojure.java.jdbc :as jdbc]))

        (def firebird-setting {:description "Firebird Database"
                           :classname   "org.firebirdsql.jdbc.FBDriver"
                           :subprotocol "firebirdsql"
                           :subname     "//localhost:3051//firebird/data/test.fdb"
                           :user        "user"
                           :password    "pass"})

    (jdbc/query firebird-setting
                "select ts from TestTB")

和结果

({:ts #inst "1994-10-11T17:00:00.000000000-00:00"})

最佳答案

问题是 JDBC 要求检索时间戳(没有时区信息),就好像该值在默认(当前)JVM 时区中一样。另见 Is java.sql.Timestamp timezone specific?

这意味着如果存储在数据库中的值是 1994-10-12 00:00:00,并且您的 JVM 时区是 GMT+7,那么时间将被检索为 1994-10-12 00:00:00+07:00,与1994-10-11T17:00:00+00:00相同

一般的解决方法是:

  1. 更改默认的 JVM 时区(或什至您机器的区域设置配置),使其为 GMT。请仔细考虑此选项,因为这会对您的申请产生其他影响。
  2. getTimestamp(int index, Calendar calendar) 与配置了适当时区的 Calendar 一起使用
  3. 使用 getObject(int index, Class clazz) 并将 LocalDateTime.class 作为参数(如果您使用 Jaybird 3.0.x)。这会将值检索为无时区的 java.time.LocalDateTime,因此没有这些问题。
  4. 利用在默认 JVM 时区中检索时间的知识并适本地转换它(例如,通过使用考虑了正确时区的日期格式呈现它)。

我不懂 Clojure,所以很遗憾我无法提供 Clojure 特定的答案。

关于jdbc - 来自sql数据库的日期时间结果在clojure jdbc中不相同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51406326/

相关文章:

entity-framework - Firebird/ Entity Framework 外键名称

java - 您如何正确关闭 JDBC 连接以供重用?

java - jdbc是否支持波斯语

java.sql.SQLException : Unknown initial character set index '255' received from server for connector 8. 0.11

emacs - 如何使 nrepl-ritz-jack-in 通过 TRAMP/Emacs 远程工作

clojure - Clojure 中的树遍历

.net - 在应用程序关闭之前,Firebird 实际上不会删除表

java - 在一条语句中使用 getGenerateKeys() 从 java 向 Oracle 数据库中插入多行

clojure - Clojure 的 some-> 宏的实际使用示例

csv - 如何使用 isql Firebird 3.04 格式化 CSV 文件中的输出?