Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 从Hibernate查询中的时间戳提取时间_Sql_Postgresql_Hibernate_Spring Data Jpa_Hql - Fatal编程技术网

Sql 从Hibernate查询中的时间戳提取时间

Sql 从Hibernate查询中的时间戳提取时间,sql,postgresql,hibernate,spring-data-jpa,hql,Sql,Postgresql,Hibernate,Spring Data Jpa,Hql,我试图在HQL中过滤带有特定时间范围的时间戳日期的记录。例如,获取上月下午1点到下午3点之间创建的所有项目 我最初的想法是通过PostgreSQL的::time将时间戳字段转换为time。但是Hibernate没有这个嵌入函数(我使用HQL构建查询) 似乎有函数,但没有时间格式化程序。我对实现没有严格的要求,如果符合主要思想,我可以调整解决方案。现在,我将日期边界作为时间戳发送,时间值作为字符串发送,并在之间进行两次并行的比较 @Query("SELECT t FROM Table t WHER

我试图在HQL中过滤带有特定时间范围的时间戳日期的记录。例如,获取上月下午1点到下午3点之间创建的所有项目

我最初的想法是通过PostgreSQL的
::time
将时间戳字段转换为time。但是Hibernate没有这个嵌入函数(我使用HQL构建查询)

似乎有函数,但没有时间格式化程序。我对实现没有严格的要求,如果符合主要思想,我可以调整解决方案。现在,我将日期边界作为时间戳发送,时间值作为字符串发送,并在之间进行两次并行的比较

@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);
@Query(“从表t中选择t,其中t.status.id=?1”

+“和t.startDate>=?2和t.startDate=?4和t.startDate::time文档建议您可以从时间戳列中“提取”小时:

extract(field FROM source) 
源必须是日期、时间戳、间隔或可以 转换为日期或时间戳。支持的字段包括: 天,星期几,小时,分钟,月,季度,第二,周和年。

然后你应该可以在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
选择t*
来自表t
其中t.status.id=?1
和t.startDate>=?2和t.startDate=?4

并提取(hour FROM t t.startDate)它现在是什么类型?据我所知=运算符可以与TimesStartDate配合使用startDate是TIMESTAMP(6),在Postgres中是时区,在domain类中是Instant。筛选参数是日期的long/TIMESTAMP,以及时间的“HH:MM”格式的字符串为什么不更改筛选条件(和模型)到实际时间戳(在你的例子中是intstants)?拆分日期和时间简直是胡说八道。我需要分别筛选日期和时间间隔。定义日期周期,然后在那里选择特定的小时数。例如,某个月10:00到12:00之间的所有记录。这就是为什么我开始使用时间casting和CAST(xxx作为时间)好主意!不过,我注意到它会自动提取本地时区的小时数。因此,如果我传递整数参数,它也应该在之前转换为这个时区。此外,如果我需要比较时间,它也应该是分钟。它变得复杂了,我可能只会为时间值添加另一个字段,但经过一些润色后,它可以是的,如果数据有多个时区,那么您需要将数据转换为一个时区,例如转换为utc时间戳(),这样小时过滤器就有意义了。您在问题中没有提到分钟,但可能需要使用unix时间戳()经过一些思考后,我们能够以以下方式组合查询中的小时和分钟:@query(“从表m中选择m,其中m.status.id=:statusId“+”和m.startDate>=:startDate和m.startDate=:startTime“+”和(提取(从m.startDate提取小时)*60+提取(从m.startDate提取分钟))