MySQL 的 h2 中的 TIME() 函数和 Java
MySQL's TIME() function in h2 with Java
因此,我需要将以下查询翻译成 Java
SELECT * FROM table WHERE TIME(date) BETWEEN TIME(startTime) AND TIME(endTime)
其中 date
是日期时间列。 startTime
和endTime
都是局部变量。
我现在使用的技术是 Spring 和 Hibernate。
以下解决方案
query.add(
Restrictions.sqlRestriction(
"TIME(date) between TIME('?') and TIME('?')", values, types
);
,其中 values
变量是 startTime
和 endTime
的数组,types
变量是 values
各自的数组类型(字符串),不幸的是与 H2 不兼容,因为 TIME
函数没有实现。我确实知道 HOUR
、MINUTE
和 SECOND
函数已实现并正常工作。
我自己还没想出实现的方法,网上也没找到解决办法。有谁知道我该如何克服这个问题?
如果你通读了 HQL 语言规范,你会发现它基本上没有对 date/time 函数的任何支持。这主要是因为每个数据库都有自己处理日期和时间的方式,所以很少有通用的支持。但是,CAST
函数是HQL支持的,前提是底层数据库也支持。从 H2 documentation 中,我们找到这个转换为时间的例子:
CAST(TIMESTAMP '2010-01-01 10:40:00.123456' AS TIME(6))
因此,您可以尝试在 HQL 查询中这样做:
SELECT *
FROM table
WHERE
CAST(date AS TIME(6)) BETWEEN CAST(startTime AS TIME(6)) AND
CAST(endTime AS TIME(6));
因此,我需要将以下查询翻译成 Java
SELECT * FROM table WHERE TIME(date) BETWEEN TIME(startTime) AND TIME(endTime)
其中 date
是日期时间列。 startTime
和endTime
都是局部变量。
我现在使用的技术是 Spring 和 Hibernate。
以下解决方案
query.add(
Restrictions.sqlRestriction(
"TIME(date) between TIME('?') and TIME('?')", values, types
);
,其中 values
变量是 startTime
和 endTime
的数组,types
变量是 values
各自的数组类型(字符串),不幸的是与 H2 不兼容,因为 TIME
函数没有实现。我确实知道 HOUR
、MINUTE
和 SECOND
函数已实现并正常工作。
我自己还没想出实现的方法,网上也没找到解决办法。有谁知道我该如何克服这个问题?
如果你通读了 HQL 语言规范,你会发现它基本上没有对 date/time 函数的任何支持。这主要是因为每个数据库都有自己处理日期和时间的方式,所以很少有通用的支持。但是,CAST
函数是HQL支持的,前提是底层数据库也支持。从 H2 documentation 中,我们找到这个转换为时间的例子:
CAST(TIMESTAMP '2010-01-01 10:40:00.123456' AS TIME(6))
因此,您可以尝试在 HQL 查询中这样做:
SELECT *
FROM table
WHERE
CAST(date AS TIME(6)) BETWEEN CAST(startTime AS TIME(6)) AND
CAST(endTime AS TIME(6));