日期查询与Hibernate在PostgreSQL的时间戳列
-
23-09-2019 - |
题
一个表具有时间戳列。在样本值可以是2010-03-30 13点42分42秒。与Hibernate,我做范围查询Restrictions.between( “COLUMN-名”,FROM日期,TODATE)。
Hibernate映射此列如下。
<property name="orderTimestamp" column="order_timestamp" type="java.util.Date" />
让我们说,我想找出所有具有日期30日在这一领域2010年3月和3月31日2010年一系列的查询做如下的记录。
Date fromDate = new SimpleDateFormat("yyyy-MM-dd").parse("2010-03-30");
Date toDate = new SimpleDateFormat("yyyy-MM-dd").parse("2008-03-31");
Expression.between("orderTimestamp", fromDate, toDate);
这是行不通的。
该查询被转换为相应的时间戳为“2010-03-30 00:00:00”和“2010-03-31 00:00:00”。所以,全部为31 2010年3月的记录将被忽略。
一个简单的解决这个问题可能是有结束日期为“2010-03-31 23:59:59。”但是,我想知道是否有办法只匹配时间戳列的日期部分。
另外,是两个界限Expression.between()
包容?文档不扔在此任何光。
没有正确的解决方案
其他提示
,我想知道是否有方式只匹配时间戳列的日期部分。
如果您不想TIMESTAMP,使用日期(而不是你应该使用type="date"
?)。
另外,是Expression.between()包括的两个限制?
似乎BETWEEN操作的SQL的行为是数据库依赖性。与PosgresQL的之间的表达:
x BETWEEN y AND z
在语义上等同于:
y <= x AND x <= z
即。包容。
在 “2010-03-31 23:59:59。”边界条件是潜在的危险:如果有在23:59:59和00:00:00之间的系统交易,你会错过它。如果你每天和足够长的时间有足够的交易中,报告要打破,你会花时间找出原因。
的PostgreSQL between
包括限制,以便它不会即使是安全的结束日期设置为2010-04-01 00:00:00。使用LT()和GT()是肯定的。
也许你可以投orderTimestamp为日期。 HQL 确实有支持此
使用铸造(your_data,日期),记住铸造函数的第二ARG必须是较低的,或它不会工作。
ATT .:塞缪尔\ Maycon