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'

日付、タイムスタンプ、または数値を文字データとして保存しないもう 1 つの正当な理由

于 2011-03-16T15:17:37.150 に答える
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 に答える
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 に答える