1. ホーム
  2. oracle

[解決済み] ORA-01849: 時間は 1 から 12 の間でなければなりません。

2022-02-05 07:12:42

質問

WHERE (ResTRRequest.RequestTime BETWEEN TO_CHAR(TRUNC(TO_DATE('2012-12-01 20:10:10', 'HH')), 'YYYY-MM-DD HH24:MI:SS') 
AND TO_CHAR(TRUNC(CURRENT_TIMESTAMP, 'HH') + INTERVAL '59:59' MINUTE TO SECOND, 'YYYY-MM-DD HH24:MI:SS'))

クエリに上記のwhere条件があり、それを実行すると、私が与えた静的な日付、すなわち''2012-12-01 20:10:10', 'HH')のために時間が1〜12の間でなければならないと表示されました。

どうすればいいですか?

少し分解してみましょう。

WHERE (ResTRRequest.RequestTime
  BETWEEN TO_CHAR(TRUNC(TO_DATE('2012-12-01 20:10:10', 'HH')), 'YYYY-MM-DD HH24:MI:SS') 
     AND TO_CHAR(TRUNC(CURRENT_TIMESTAMP, 'HH') + INTERVAL '59:59' MINUTE TO SECOND, 'YYYY-MM-DD HH24:MI:SS'))

そもそも、こんな意味じゃないでしょう。 TRUNC(TO_DATE('2012-12-01 20:10:10', 'HH')) たぶん、こういうことだと思います。 TRUNC(TO_DATE('2012-12-01 20:10:10'), 'HH') . 1~12までの数字は、1時間の間に 20 というマスクで日付に変換しようとしています。 HH . でも、さっきも言ったようにタイプミスだと思うんです。また TIMESTAMP を使用するのではなく、ここでリテラル TO_DATE() :

TRUNC(TIMESTAMP'2012-12-01 20:10:10', 'HH')

次に、念のためですが、日付やタイムスタンプを文字列として保存していますか? それはよくないな。

3つ目は、「Security(セキュリティ)」です。 BETWEEN を日付の比較で使用すると、エッジケースを見逃す可能性があるからです。以下のように書き換えた方がいいかもしれません。

WHERE ( ResTRRequest.RequestTime >= TO_CHAR(TRUNC(TO_DATE('2012-12-01 20:10:10'), 'HH'), 'YYYY-MM-DD HH24:MI:SS') 
    AND ResTRRequest.RequestTime < TO_CHAR(TRUNC(CURRENT_TIMESTAMP, 'HH') + INTERVAL '1' HOUR, 'YYYY-MM-DD HH24:MI:SS') )