在PostgreSQL中使用Hibernate on Timestamp Column进行日期查询

时间:2010-03-30 07:35:39

标签: java hibernate postgresql orm date

表有时间戳列。其中的样本值可能是2010-03-30 13:42:42。使用Hibernate,我正在进行范围查询Restrictions.between(“column-name”,fromDate,toDate)。

此列的Hibernate映射如下。

<property name="orderTimestamp"  column="order_timestamp" type="java.util.Date" />

让我们说,我想找出所有日期为2010年3月30日和2010年3月31日的记录。此字段的范围查询如下:

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”。因此,2010年3月31日的所有记录都将被忽略。

解决此问题的简单方法可能是将结束日期定为“2010-03-31 23:59:59”。但是,我想知道是否有方法只匹配时间戳列的日期部分。

此外,Expression.between()是否包含两个限制?文档没有说明这一点。

4 个答案:

答案 0 :(得分:3)

  

,我想知道是否有办法只匹配时间戳列的日期部分。

如果您不想要TIMESTAMP,请使用DATE(不应该使用type="date"?)。

  

此外,Expression.between()是否包含两个限制?

似乎SQL BETWEEN运算符的行为是database dependent。使用PosgresQL,BETWEEN表达式:

x BETWEEN y AND z

在语义上等同于:

y <= x AND x <= z

即。包容。

答案 1 :(得分:1)

“2010-03-31 23:59:59”。边界条件具有潜在的危险性:如果在23:59:59到00:00:00之间系统中有交易,你就会错过它。如果您每天有足够的交易时间和足够长的时间,报告将会中断,您将花费数小时查找原因。

PostgreSQL between includes the limits因此将结束日期设置为2010-04-01 00:00:00甚至是不安全的。使用lt()和gt()来确定。

答案 2 :(得分:0)

也许你可以将DAST的orderTimestamp CAST。 HQL does have support

答案 3 :(得分:0)

使用cast(your_data,date),记住cast函数的第二个arg必须更低,否则它将不起作用。

Att。:Samuel \ Maycon