【问题标题】:Extract time from timestamp in Hibernate query从 Hibernate 查询中的时间戳中提取时间
【发布时间】: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


【解决方案1】:

文档建议您可以从时间戳列中“提取”小时:

extract(field FROM source) 

来源必须是日期、时间戳、间隔或字符串 转换为日期或时间戳。支持的字段包括: 日、星期几、小时、分钟、月、季度、秒、周和年。 https://cwiki.apache.org/confluence/display/Hive/LanguageManual+UDF#LanguageManualUDF-TypeConversionFunctions

然后你应该可以在 where 子句中使用它

SELECT t.*
FROM Table t 
WHERE t.status.id = ?1
AND t.startDate >= ?2 AND t.startDate <= ?3
AND extract(hour FROM t.startDate)   >= ?4 
AND extract(hour FROM t.startDate)  <= ?5

【讨论】:

  • 好主意!但是,我注意到它会自动提取本地时区的小时数。所以如果我传递整数参数,它之前也应该转换为这个时区。另外,如果我需要比较时间,也应该是分钟。它变得复杂了,我可能会为时间值添加另一个字段,但经过一些改进后,它可以管理为有效的解决方案!
  • 是的,如果数据有多个时区,您需要将数据按摩到单个时区,例如to_utc_timestamp() 所以小时过滤器是有意义的。您没有在问题中提及分钟,但也许使用 unix_timestamp() 会有所帮助。
  • 经过一番思考,能够通过以下方式在查询中组合小时和分钟:@Query("SELECT m FROM Table m WHERE m.status.id = :statusId " + " AND m.startDate >= :startDate AND m.startDate = :startTime " + " AND (extract(hour FROM m.startDate) * 60 + extract(minute FROM m.startDate))
猜你喜欢
  • 2015-01-10
  • 2016-08-10
  • 2012-05-20
  • 2018-04-17
  • 1970-01-01
  • 1970-01-01
  • 2018-07-18
  • 2021-02-18
  • 1970-01-01
相关资源
最近更新 更多