例えば:
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を教えていただけるとありがたいです。
大抵は文字列を日時型に変更するところがポイントになると思うんですけど
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);
ということですね。
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のままコピペしちゃいました。
ごめんなさい。。。
先の回答と同じです。
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’
ありがとうございます。参考にしてみます。
すいません。これテストしてみたのですが、思い通りの結果が得られません。
このSQLだと 2000-09-01 の01:00:00〜03:00:00 を抽出しているのでは?
例だと、2000-09-01 から 2000-09-03 の 01:00:00〜03:00:00 だけを抽出したいのですが...。