2010-03-30 31 views
6

一个表具有timestamp列。其中的示例值可能是2010-03-30 13:42:42。有了Hibernate,我正在做一个范围查询限制。(“column-name”,fromDate,toDate)。在PostgreSQL的Timestamp Column上使用Hibernate进行日期查询

该列的Hibernate映射如下。

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

比方说,我想找出所有具有30日期2010年3月和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()包括两个限制?文档并没有提到这一点。

+0

我相信在两者之间总是排他性的限制。你为什么不移动1毫秒并为它们加1毫秒? – jishi 2010-03-30 08:03:33

+3

@ jishi它的数据库依赖(和大部分时间包容我相信)。 – 2010-03-30 08:09:10

+0

Shashikant你能解决这个问题吗? – changeme 2013-06-12 22:15:29

回答

1

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

PostgreSQL betweenincludes the limits因此,将结束日期设置为2010-04-01 00:00:00并不安全。确定使用lt()和gt()。

+0

仍然不会飞,这将包括2010-04-01 00:00 AM – 2010-03-30 08:08:10

+0

使用lt(“endDate”,endDate)其中endDate =“2010-04-01 00:00”将包括结束日期2010 -04-01 00:00?我不认为是这样。 – 2010-03-30 08:26:20

+0

感谢您为PostgreSQL包含的'between'之间的链接。 边界条件没有什么太大的担心,因为时间戳只记录秒的精度。要使用,小于或大于,我需要使用小于(“2010-04-01 00:00:00”)和大于或等于(“2010-03-30 00 :00:00“) – 2010-03-30 09:52:47

3

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

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

此外,是表达式。之间()包括两个极限?

似乎SQL BETWEEN运算符的行为是database dependent。与PosgresQL的之间的表达:

x BETWEEN y AND z 

在语义上等同于:

y <= x AND x <= z 

即包括在内。

+0

type =”date“没有帮助。想尝试一下你以前的注释想法,但不幸的是,我在Hibernate 3.3以上的版本中引入了注释。 – 2010-03-30 09:44:22

+0

@Shashikant我张贴我的答案有点太快,没有意识到你使用的XML映射(因此更新)。但的确,Hibernate注释对此有一个@Temporal注解(http://docs.jboss.org/hibernate/stable/annotations/reference/en/html_single/#d0e342)。必须有某种与xml相当的功能......您是否可以对自己的物理模型进行控制? – 2010-03-30 10:19:12

+0

除了DB架构(即timstamp列)和Hibernate版本,我可以改变everthing其他。时间注释听起来很有用,但正如我所提到的,我不能移动到Hibernate 3.3+。 另外,如果我添加Temporal annoation作为日期,而检索行,它会截断日期时间戳吗?如果是的话,那是不可取的。 感谢您的帮助,帕斯卡。修改+1。 – 2010-03-30 11:16:43

0

使用强制转换(your_data,date),记住强制转换函数的第二个arg必须低一些,否则它不能工作。

Att .: Samuel \ Maycon

相关问题