Java PostgreSQL中Hibernate对时间戳列的日期查询

Java PostgreSQL中Hibernate对时间戳列的日期查询,java,hibernate,postgresql,orm,date,Java,Hibernate,Postgresql,Orm,Date,表具有时间戳列。其中的样本值可能是2010-03-30 13:42:42。使用Hibernate,我正在执行范围查询限制.between(“列名”,fromDate,toDate) 此列的Hibernate映射如下所示 <property name="orderTimestamp" column="order_timestamp" type="java.util.Date" /> Date fromDate = new SimpleDateFormat("yyyy-MM-dd")

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

此列的Hibernate映射如下所示

<property name="orderTimestamp"  column="order_timestamp" type="java.util.Date" />
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()
是否包含这两个限制?文档对此没有任何说明。

也许您可以将orderTimestamp转换为日期。“2010-03-31 23:59:59。”边界条件有潜在危险:如果系统中在23:59:59和00:00:00之间有事务,您将错过它。如果你每天有足够多的交易,并且时间足够长,那么一份报告就会被打破,你将花费数小时来找出原因

PostgreSQL
介于
之间,因此将结束日期设置为2010-04-01 00:00:00甚至都不安全。使用lt()和gt()来确保

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

如果您不需要时间戳,请使用日期(您不应该使用
type=“DATE”
?)

另外,Expression.between()是否包含这两个限制

看来,SQLbetween操作符的行为是错误的。对于PosgresQL,表达式之间:

x BETWEEN y AND z
在语义上等同于:

y <= x AND x <= z
y使用cast(您的数据、日期),请记住cast函数的第二个参数必须较低,否则将无法工作


收件人:Samuel\Maycon

我相信在这两个界限上,between始终是唯一的。你为什么不删除1毫秒,然后给每个增加1毫秒?@jishi它依赖于数据库(我相信大部分时间都包括在内)。Shashikant你能解决这个问题吗?还是不能飞,那将包括2010-04-01 00:00有趣的lt(“endDate”,endDate),其中endDate=“2010-04-01 00:00”是否包括截止日期为2010-04-01 00:00的记录?我认为情况并非如此。感谢您为PostgreSQL提供包含“中间”的链接。边界条件并不令人担忧,因为时间戳的记录精度仅为秒。要使用小于或大于,我需要使用小于(“2010-04-01 00:00:00”)和大于或等于(“2010-03-30 00:00:00”)type=“date”没有帮助。我想尝试一下您之前的注释想法,但不幸的是,我使用的是Hibernate版本,版本早于3.3,其中引入了注释。@Shashikant我发布答案有点太快了,没有意识到您使用的是xml映射(因此更新)。但事实上,Hibernate注释对此有一个@Temporal注释()。xml肯定有某种等价物。。。顺便说一句,你对你的物理模型有控制权吗?除了DB模式(即timstamp列)和Hibernate版本外,我可以更改其他任何东西。时态注释听起来很有用,但正如我提到的,我不能移动到Hibernate 3.3+。另外,如果我在检索行时添加时间注释作为日期,它会将时间戳截断为日期吗?如果是,这是不可取的。谢谢你的帮助,帕斯卡。Modding+1。@使用时态注释作为日期的PascalThivent跳过api请求上的gson序列化,从而在客户端获取以前的日期。如果数据库上的dob为“13-11-1987”,则将其作为rest api响应获取为“12-11-1987”。@PascalThivent请参阅