SQLについて質問です。


以下の列で構成されるテーブルがあります。(全列varchar型)
 (1).日付 'yyyy/MM/dd'
 (2).時刻 'HH:mm:ss'
 (3).コメント

このテーブルに対し、
検索条件 [日付From],[時刻From],[日付To],[時刻To] を指定して
日時範囲を検索(SELECT)する場合の、WHERE句の書き方を教えて下さい。

SQLServer・Oracle どちらでもOKです。

回答の条件
  • URL必須
  • 1人3回まで
  • 登録:
  • 終了:2006/07/05 20:30:04
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

回答7件)

id:taknt No.1

回答回数13539ベストアンサー獲得回数1198

ポイント18pt

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]

id:bonlife No.2

回答回数421ベストアンサー獲得回数75

ポイント17pt

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]

参考になれば幸いです。

id:Sampo No.3

回答回数556ベストアンサー獲得回数104

ポイント17pt

takntさんのだと、日付が範囲内で、かつ時刻も範囲内という条件を指定していることになりますね。

それがお望みであれば構わないのですが、指定日付時刻以降、指定日付時刻まで、であれば

WHERE 日付+時刻 BETWEEN "[日付From]"+"[時刻From]" AND "[日付To]"+"[時刻To]"

とします。

http://q.hatena.ne.jp/1151494031

id:litetuna

「指定日付時刻 ~ 指定日付時刻」が希望です。

「'2006/05/01 00:00:00' ~ '2006/05/02 00:00:00'」の場合、

[2006/05/01]分のデータ全てと[2006/05/02 00:00:00]のデータが取れればベストです。

2006/06/29 07:05:04
id:vector_xenon No.4

回答回数113ベストアンサー獲得回数4

ポイント17pt

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')


もしかしたら日付と時刻の間にブランクがないといけないかもしれません。

http://www.mitene.or.jp/~rnk/TIPS_ORCL_FUNC2.htm#FUNC2

id:taknt No.5

回答回数13539ベストアンサー獲得回数1198

ポイント17pt

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ですね。

http://www.atmarkit.co.jp/fnetwork/rensai/sql01/sql1.html

id:Sampo No.6

回答回数556ベストアンサー獲得回数104

ポイント17pt

3の者です。そのご希望でしたら、3の回答で満たしているはずです。takntさんの5の回答も同じですね。(使っている演算記号が違うだけです。SQLServerだと文字列の結合は + でできます。Oracleでは || なのかな?)

4の方に、文字列なので(単純な比較は)無理だとのご指摘をいただいていますが、今回の場合日付・時刻とも桁数固定のようですので、文字列の辞書順比較で問題ありません。

http://q.hatena.ne.jp/answer

id:samejima No.7

回答回数92ベストアンサー獲得回数8

ポイント17pt

演算結果で検索をすると遅くなるので

WHERE
    日付 = [日付From]
    AND
    時刻 >= [時刻From]
    OR
    日付 > [日付From]
    AND
    日付 < [日付To]
    OR
    日付 = [日付To]
    AND
    時刻 <= [時刻To]

http://q.hatena.ne.jp/answer

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません