【发布时间】:2019-02-26 06:45:54
【问题描述】:
我正在尝试在 HQL 中过滤带有某些特定时间范围的时间戳日期的记录。例如,获取上个月下午 1 点到 3 点之间创建的所有项目。
我最初的想法是通过::time 从 PostgreSQL 将时间戳字段转换为时间。但是 Hibernate 没有这个嵌入式功能(我使用 HQL 构建查询)。
似乎有date 功能但没有时间格式化程序。我对实施没有严格的要求,如果符合主要思想,我可以调整解决方案。现在我将日期边界作为时间戳发送,将时间值作为字符串发送,并进行两个并行的between 比较。
@Query("SELECT t FROM Table t WHERE t.status.id = ?1"
+ " AND t.startDate >= ?2 AND t.startDate <= ?3"
+ " AND t.startDate::time >= ?4 AND t.startDate::time <= ?5")
Page<Item> findByStatusIdAndDateRange(Long activeId, final long startDate, final long endDate, final String startTime, final String endTime, Pageable pageRequest);
这不是生产代码,因此在查询中转换值没有性能问题。
感谢您的建议!
【问题讨论】:
-
现在是什么类型的?据我所知,= 运算符可以很好地处理时间戳
-
startDate 在 Postgres 中是 TIMESTAMP(6) WITH TIME ZONE,在域类中是 Instant。过滤器参数是日期和字符串的长/时间戳,时间格式为 'HH:MM'
-
您为什么不将过滤条件(和模型)更改为实际时间戳(在您的情况下为intstants)?拆分日期和时间只是一种废话。
-
我需要分别过滤日期和时间间隔。定义日期期间,然后在那里选择特定的时间。例如,某个月份 10:00 到 12:00 之间的所有记录。这就是我开始使用时间投射的原因
-
尝试 CAST stackoverflow.com/a/4793868/1527544 和 CAST(xxx as time)
标签: sql postgresql hibernate spring-data-jpa hql