簡體   English   中英

不帶時區的 PostgreSQL 時間戳和帶時區的 java.util.Date 之間的比較

[英]Comparsion between PostgreSQL timestamp without timezone and java.util.Date with timezone

我想知道將如何執行以下查詢中的比較:

StringBuilder queryStr = new StringBuilder();
queryStr.append("SELECT o FROM PRDBook as o WHERE ")
        .append("o.publicationDate < :now");

Query query = entityManager.createQuery(queryStr.toString());
Date now = new Date();
query.setParameter("now", now);

在數據庫中, publicationDate列的類型為timestamp without time zone 此列中的示例值:

2018-03-01 18:00:00

now.toString()的結果是:

Wed Aug 22 16:14:03 CEST 2018

是否會以這種方式進行上述數據之間的比較:

2018-03-01 18:00:00 < 2018-08-22 16:14:03

或者那樣:

2018-03-01 18:00:00 < 2018-08-22 14:14:03

有趣的問題。

當 PostgreSQL 的 JDBC 驅動程序讀取一個timestamp without time zone類型的timestamp without time zonetimestamp without time zone ,它通常可以將它讀取到java.sql.Timestampjava.util.Date

如果您選擇將其讀取到java.util.Date (您的情況),PostgreSQL 的 JDBC 驅動程序會自動將本地 JVM 時區添加到其中。 這是有道理的,因為timestamp without time zone類型列的整個點將被視為“本地”時間戳。

相反,當您將java.util.Date發送到數據庫時,它會立即剝離時區。 因此查詢條件將采用以下形式:

2018-03-01 18:00:00 < 2018-08-22 16:14:03

附帶地,這意味着建議您顯式設置 JVM 時區,以確保 JDBC 驅動程序以正確的方式將timestamp without time zone的數據庫timestamp without time zone重新組裝到java.util.Date

否則,不同時區的不同服務器讀取同一數據庫中的同一行時,會將時間戳解釋為不同的時刻。 盡管如此,對於使用“本地”時間戳的應用程序來說,這可能不是一個有效的用例。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM