首页 > 解决方案 > H2 - 在 Java 中构建和执行查询到日期比较

问题描述

我想创建一个包含另一个表的所有记录的表,其中 BirthDate 是 < 某个日期

我试图在我的 Java 应用程序中构建和执行这个查询。

比较日期(2016-12-31)是一个字符串,出生日期作为日期时间存储在 H2 数据库中。

CREATE TABLE table1 AS
SELECT *
FROM temp
WHERE FORMATDATETIME(BirthDate,'yyyy-MM-dd') < 2016-12-31
GROUP BY Cod, Id
ORDER BY Cod, BirthDate

执行查询时出现此错误:

org.h2.jdbc.JdbcSQLException: Data conversion error converting "2016-12-31"; SQL statement:

标签: javadatetimeh2

解决方案


如果BirthDate是日期或日期时间值,则不应将其转换为字符串值以进行此类比较。但是,对于某些比较操作,您可能需要将日期时间值转换为日期值,在这种情况下使用CAST(datetime AS DATE). 在您的查询中,它并不是真正需要的。

日期字面量不能写成2016-12-31,这样的表达式表示一个带有两个减法的数值表达式。日期文字应写为DATE '2016-12-31'.

CREATE TABLE table1 AS
SELECT *
FROM temp
WHERE BirthDate < DATE '2016-12-31'
GROUP BY Cod, Id
ORDER BY Cod, BirthDate

此查询中的GROUP BY子句也无效。H2 在该领域不是很严格,如果分组列中没有具有相同值的重复行,则可以接受此类查询,但您不应依赖此类行为。未分组的列可能不会被选中,它们可能只会被聚合。如果Id是主键,则应删除该子句,因为它没有用。

CREATE TABLE table1 AS
SELECT *
FROM temp
WHERE BirthDate < DATE '2016-12-31'
ORDER BY Cod, BirthDate

推荐阅读