2

2 つの SQL ステートメントを作成しようとしています。1 つ目は午後 11 時から午前 6 時までの間を表示し、2 つ目は午後 11 時から午前 6 時の間を表示しません。

私が理解しようとしているのは、「NOT」と言うときです。

WHERE TO_CHAR(MOPACTIVITY.MOPSTART, 'hh24:mi') NOT BETWEEN '23:00' AND '06:00'

「23:00」と「06:00」の間のレコードを取得します。これは、私が SQL で求めていることとは反対のようです。どうしたの?

4

3 に答える 3

3

'SSSSS' 1 つの解決策は、書式マスクを使用することです。真夜中からの秒数を示し、日付要素に関係なく時間を処理するのに最適です。

06:00 ~ 23:00 の時間帯は

select * from t23
where to_number(to_char(some_date_coll, 'SSSSS')) is between (6*60*24) and (23*60*24);

23:00~06:00の時間帯は

select * from t23
where to_number(to_char(some_date_coll, 'SSSSS')) < (6*60*24) 
     or to_number(to_char(some_date_coll, 'SSSSS')) > (23*60*24);

または、最初のクエリで NOT BETWEEN を使用します。

ハードコーディングされた秒数よりも理解しやすい (および修正しやすい) ため、算術演算を展開した形式のままにしています。

インデックス付きの列に関数をラップすることによるパフォーマンスへの影響に関する通常の警告がここに適用されます。

于 2013-07-05T16:13:16.373 に答える