我为一个小项目使用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:For 输入字符串:“”21-15.22.07“”“;
任何想法?
感谢
答案 0 :(得分:4)
您必须使用parsedatetime()才能将角色数据“投射”到某个日期。
http://h2database.com/html/functions.html#parsedatetime
这样的事情:
SELECT * FROM USER WHERE parsedatetime(DATE_CONTRACT, 'yyyy-MM-dd-HH.mm.ss') > DATE '2005-02-21'
永远不会将日期,时间戳或数字存储为字符数据的另一个好理由
答案 1 :(得分:2)
为什么要转换为日期?如果DATE_CONTRACT使用一致的CHAR(19),您可以:
SELECT *
FROM USER
WHERE DATE_CONTRACT >= '2005-02-22-00.00.00'
;
如果我错了,请纠正我,但如果DATE_CONTRACT
上有索引,这将比转换为日期/日期时更快。
答案 2 :(得分: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支持format supported by JDBC,加上ISO 8601。