Clojure/JDBC/Postgresql:我试图从一个字符串更新Postgresql中的时间戳值,得到一个错误
在postgresql中使用clojure jdbc库。我在postgresql中有一个带有时间戳列“created_at”的表“xxx”,还有一个包含正确格式的日期的字符串。执行插入操作失败: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
(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时间的自述!