SQLでtimestamp型のデータを抽出する場合に、時間範囲を指定して抽出したいのですがどのようにすればよろしいでしょうか?


例えば:
2000-09-01 00:00:00
2000-09-01 01:00:00
2000-09-01 02:00:00
2000-09-01 03:00:00
2000-09-02 00:00:00
2000-09-02 01:00:00
2000-09-02 02:00:00
2000-09-02 03:00:00
2000-09-03 00:00:00
2000-09-03 01:00:00
2000-09-03 02:00:00
2000-09-03 03:00:00

のデータが存在した場合、2000-09-01から2000-09-03 までのデータの内、01:00:00から03:00:00までのデータを抽出したいというもです。

データベースはPostgreSQLですが、バージョンやできればデータベースに依存しないSQLを教えていただけるとありがたいです。

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

回答3件)

id:redcherry No.1

回答回数135ベストアンサー獲得回数0

ポイント20pt

大抵は文字列を日時型に変更するところがポイントになると思うんですけど


PostgreSQL 7.1以降は有効なのをオンラインマニュアルで確認

select * from t_src where f_time>=(timestamp ’2000-09-01 01:00:00’) and f_time<=(timestamp ’2000-09-01 03:00:00’);

select * from t_src where f_time>=cast(’2000-09-01 01:00:00’ as datetime) and f_time<=cast(’2000-09-01 03:00:00’ as datetime);


Oracle 7の頃はこんなだった憶えがあります。

select * from t_src where f_time>=to_date(’20000901010000’,’YYYYMMDDHH24MISS’) and f_time<=to_date(’20000901030000’,’YYYYMMDDHH24MISS’);


Oracle 9i以降はこれが使えるらしいです

select * from t_src where f_time>=cast(’2000-09-01 01:00:00’ as datetime) and f_time<=cast(’2000-09-01 03:00:00’ as datetime);


MS SQLServer2000 たぶんSybase系はこんな感じ

select * from t_src where f_time>=convert(datetime,’2000-09-01 01:00:00’,20) and f_time<=convert(datetime,’2000-09-01 03:00:00’,20);

select * from t_src where f_time>=cast(’2000-09-01 01:00:00’ as datetime) and f_time<=cast(’2000-09-01 03:00:00’ as datetime);

※上の例の’,20’は省略可能なんですけど非常に明示的です


MySQL 4.0.2以降で使える表現

select * from t_src where f_time>=convert(datetime,’2000-09-01 01:00:00’) and f_time<=convert(datetime,’2000-09-01 03:00:00’);

select * from t_src where f_time>=cast(’2000-09-01 01:00:00’ as datetime) and f_time<=cast(’2000-09-01 03:00:00’ as datetime);


一番融通の利く表現は cast(expr as type)の形式である

select * from t_src where f_time>=cast(’2000-09-01 01:00:00’ as datetime) and f_time<=cast(’2000-09-01 03:00:00’ as datetime);

ということですね。

id:turinavi

すいません。これテストしてみたのですが、思い通りの結果が得られません。

このSQLだと 2000-09-01 の01:00:00〜03:00:00 を抽出しているのでは?

例だと、2000-09-01 から 2000-09-03 の 01:00:00〜03:00:00 だけを抽出したいのですが...。

2005/10/01 22:58:11
id:redcherry No.2

回答回数135ベストアンサー獲得回数0

ポイント20pt

2回目です。PostgreSQLの2つめの例は

select * from t_src where f_time>=cast(’2000-09-01 01:00:00’ as timestamp) and f_time<=cast(’2000-09-01 03:00:00’ as timestamp);


が正解です。

datetimeのままコピペしちゃいました。

ごめんなさい。。。

id:turinavi

先の回答と同じです。

2005/10/01 22:58:28
id:teru2g No.3

回答回数21ベストアンサー獲得回数0

ポイント20pt

URLはダミー 以下のSQLでどうでしょうか?

select * from t_src where to_char(f_time, ’yyyy/mm/dd’) >= ’2005/09/01’ and to_char(f_time, ’yyyy/mm/dd’) <= ’2005/09/03’ and to_char(f_time, ’hh24’) >= ’01’ and to_char(f_time, ’hh24’) <= ’03’

id:turinavi

ありがとうございます。参考にしてみます。

2005/10/02 00:21:34

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

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

トラックバック

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

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

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