2

我为一个小项目使用 H2 数据库,所有字段都是 varchar

对于查询,我必须将字符串转换为日期,所以我尝试了

SELECT * FROM USER WHERE cast(DATE_CONTRACT AS DATE)  >  '2005-02-21' 

但是有一个错误

代码 :

错误代码 90009,SQL 状态 90009:无法解析日期常量“2011-02-21-15.22.07”,原因:“java.lang.NumberFormatException:对于输入字符串:”“21-15.22.07”“”;

任何的想法?

谢谢

4

3 回答 3

4

您必须使用 parsedatetime() 才能将您的字符数据“转换”为日期。

http://h2database.com/html/functions.html#parsedatetime

像这样的东西:

选择 *
来自用户
WHERE parsedatetime(DATE_CONTRACT, 'yyyy-MM-dd-HH.mm.ss') > DATE '2005-02-21'

另一个从不将日期、时间戳或数字存储为字符数据的好理由

于 2011-03-16T15:17:37.150 回答
2

为什么要转换为日期?如果 DATE_CONTRACT 使用一致的 CHAR(19),您可以:

SELECT * 
FROM USER 
WHERE DATE_CONTRACT >= '2005-02-22-00.00.00'
;

如果我错了,请纠正我,但如果有一个索引DATE_CONTRACT,这将比转换为日期/日期时间更快。

于 2011-03-16T15:28:10.380 回答
2

当然,您可以使用内置函数PARSEDATETIME,如下所示:

CREATE TABLE USER(DATE_CONTRACT VARCHAR);
INSERT INTO USER VALUES('2011-02-21-15.22.07');
SELECT * FROM USER 
WHERE PARSEDATETIME(DATE_CONTRACT, 'yyyy-MM-dd-HH.mm.ss') > DATE '2005-02-21';

但我想以更标准的格式存储时间戳会更有意义,因此不需要特殊的解析。例子:

CREATE TABLE USER(DATE_CONTRACT TIMESTAMP);
INSERT INTO USER VALUES('2011-02-21 15:22:07');
SELECT * FROM USER 
WHERE DATE_CONTRACT > DATE '2005-02-21';

H2 支持JDBC 支持的格式,外加ISO 8601

于 2011-03-16T17:53:25.030 回答