Clojure/JDBC/Postgresql:我试图从一个字符串更新Postgresql中的时间戳值,得到一个错误

Clojure/JDBC/Postgresql:我试图从一个字符串更新Postgresql中的时间戳值,得到一个错误,postgresql,jdbc,clojure,timestamp,Postgresql,Jdbc,Clojure,Timestamp,在postgresql中使用clojure jdbc库。我在postgresql中有一个带有时间戳列“created_at”的表“xxx”,还有一个包含正确格式的日期的字符串。执行插入操作失败: (require '[clojure.java.jdbc :as sql]) (sql/with-connection *db* (sql/insert-record :xxx {:created_at "Thu Feb 09 10:38:01 +0000 2012"})) 以下是错误: org

在postgresql中使用clojure jdbc库。我在postgresql中有一个带有时间戳列“created_at”的表“xxx”,还有一个包含正确格式的日期的字符串。执行插入操作失败:

(require '[clojure.java.jdbc :as sql])

(sql/with-connection *db*
  (sql/insert-record :xxx {:created_at "Thu Feb 09 10:38:01 +0000 2012"}))
以下是错误:

org.postgresql.util.PSQLException: ERROR: column "created_at" 
is of type timestamp with time zone but expression is of type character varying
所以我知道postgres需要一个时间戳值,但如何将日期的字符串表示形式转换成postgres可以接受的形式呢?java.util.Date也失败了,我在clojure postgres库中找不到任何文档


谢谢

您需要传入一个
java.sql.Timestamp
实例。要使用Clojure的包装库将字符串解析为一个字符串,您可以按照以下步骤进行操作:

(require '(clj-time [format :as timef] [coerce :as timec])

(->> "Thu Feb 09 10:38:01 +0000 2012"
     (timef/parse (timef/formatter "EEE MMM dd HH:mm:ss Z yyyy"))
     timec/to-timestamp)
然后可以通过JDBC将返回的值传递给PostgreSQL

如果您以其他字符串格式获取日期并将其转换为此格式,则可以跳过转换,并为原始表示提供适当的格式设置程序。默认情况下,
clj-time.format/formatters
映射中有很多可用的格式,比如说在REPL上的
(clj-time.format/show-formatters)
,以查看带有示例的列表。另外,
clj-time.concure/from-string
按顺序尝试所有默认格式化程序,返回第一次后续解析的值(
nil
如果没有)。如果您是以
java.util.date
long
的形式获取日期,请参见同一命名空间中的
from date
from long

使用
[clj time“0.3.6”]
作为
项目中的依赖项说明符。如果决定使用
clj time
,请使用
clj time

或者,您可以使用其他方法将时间戳字符串解析为
java.sql.timestamp
<代码>时间戳
本身可以解析不同的字符串表示形式:

(java.sql.Timestamp/valueOf "2004-10-19 10:23:54")

clj time
是在Clojure中处理日期和时间的最明智的方式,因此它可能值得您花时间。

clj time确实是在Clojure中处理时间的方式,非常感谢!由于这是一个古老的答案,而且我是clj时间的维护者之一,我将注意到clj时间是不受欢迎的,我们鼓励人们迁移到Java时间(Java 8内置)或其包装库——根据clj时间的自述!