以下の列で構成されるテーブルがあります。(全列varchar型)
(1).日付 'yyyy/MM/dd'
(2).時刻 'HH:mm:ss'
(3).コメント
このテーブルに対し、
検索条件 [日付From],[時刻From],[日付To],[時刻To] を指定して
日時範囲を検索(SELECT)する場合の、WHERE句の書き方を教えて下さい。
SQLServer・Oracle どちらでもOKです。
http://www.techscore.com/tech/sql/05_05.html
BETWEEN を使います。
WHERE '2006/06/28' BETWEEN [日付From] AND [日付To]
AND '10:00' BETWEEN [時刻From] AND [時刻To]
Oracleを前提に考えてみました。
(現在、試す環境がないので、上手く動かなかったら申し訳ありません。)
TO_DATEでDATE型に変換して、BETWEENで比較をすれば良いと思います。
(1)の日付の列->col1
(2)の時刻の列->col2
[日付From]->date_from
[時刻From]->time_from
[日付To]->date_to
[時刻To]->time_to
とした例です。
(日付と時刻を半角スペースを1つ挟んで結合した文字列を比較の対象としています。)
SELECT * FROM table WHERE TO_DATE(col1||' '||col2,'YYYY/MM/DD HH24:MI:SS') BETWEEN TO_DATE(date_from||' '||time_from,'YYYY/MM/DD HH24:MI:SS') AND TO_DATE(date_to||' '||time_to,'YYYY/MM/DD HH24:MI:SS')
BETWEENでは両端に一致する行も選択対象になりますので、「~より大きい」、「~未満」という比較を行いたい場合、大なり記号、小なり記号を使う比較に書き換えてください。
[参考URL]
参考になれば幸いです。
takntさんのだと、日付が範囲内で、かつ時刻も範囲内という条件を指定していることになりますね。
それがお望みであれば構わないのですが、指定日付時刻以降、指定日付時刻まで、であれば
WHERE 日付+時刻 BETWEEN "[日付From]"+"[時刻From]" AND "[日付To]"+"[時刻To]"
とします。
varchar型ですから1の回答では無理です。
Oracleの場合ですが。。。
TO_DATE(日付 || 時刻, 'YYYY/MM/DDHH24:MI:SS') BETWEEN TO_DATE(日付From || 時刻From, 'YYYY/MM/DDHH24:MI:SS') AND TO_DATE(日付To || 時刻To, 'YYYY/MM/DDHH24:MI:SS')
もしかしたら日付と時刻の間にブランクがないといけないかもしれません。
CREATE TABLE SOCIA.TESTTABLE
(
ADAY VARCHAR2(10),
ATIME VARCHAR2(10),
DAT1 VARCHAR2(10)
)
select * from TESTTABLE
where
ADAY || ATIME BETWEEN '2005/01/04' || '10:00:00' and '2005/01/07' || '11:00:00'
でOKですね。
3の者です。そのご希望でしたら、3の回答で満たしているはずです。takntさんの5の回答も同じですね。(使っている演算記号が違うだけです。SQLServerだと文字列の結合は + でできます。Oracleでは || なのかな?)
4の方に、文字列なので(単純な比較は)無理だとのご指摘をいただいていますが、今回の場合日付・時刻とも桁数固定のようですので、文字列の辞書順比較で問題ありません。
演算結果で検索をすると遅くなるので
WHERE 日付 = [日付From] AND 時刻 >= [時刻From] OR 日付 > [日付From] AND 日付 < [日付To] OR 日付 = [日付To] AND 時刻 <= [時刻To]
「指定日付時刻 ~ 指定日付時刻」が希望です。
「'2006/05/01 00:00:00' ~ '2006/05/02 00:00:00'」の場合、
[2006/05/01]分のデータ全てと[2006/05/02 00:00:00]のデータが取れればベストです。