[英]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 zone
列timestamp without time zone
,它通常可以將它讀取到java.sql.Timestamp
或java.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.