2012-02-16 36 views
13

將clojure jdbc庫與postgresql配合使用。我有一個表格「xxx」,在postgresql中有一個時間戳列「created_at」,並且我有一個包含正確格式日期的字符串。做一個插入失敗:Clojure/JDBC/Postgresql:我試圖從一個字符串更新postgresql中的時間戳值,出現錯誤

(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庫上找不到任何文檔。

謝謝!

回答

15

您需要傳入java.sql.Timestamp實例。爲了解析您的字符串轉換成使用clj-time之一,Clojure的一個Joda-Time,計量庫,你會做一些事情大致如下:

(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.coerce/from-string會按順序嘗試所有默認格式化程序,以返回第一個後續解析的值(如果沒有,則爲nil)。如果您獲得的日期爲java.util.Datelong,請參閱from-datefrom-long在相同的命名空間中。

如果您決定使用clj-time,則在project.clj中使用[clj-time "0.3.6"]作爲依賴關係說明符。

或者,您可以使用其他方式解析您的時間戳字符串到java.sql.Timestamp; Timestamp本身可以分析不同的字符串表示:

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

clj-time是處理日期和時間Clojure中最明智的辦法,雖然如此,它很可能是值得的。

+0

clj-time的確是在Clojure中處理時間的方式,非常感謝! – prismofeverything 2012-02-16 09:11:38

相關問題