将varchar转换为日期

时间:2011-03-16 14:56:29

标签: sql casting h2

我为一个小项目使用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“”“;

任何想法?

感谢

3 个答案:

答案 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

相关问题