人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

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を教えていただけるとありがたいです。

●質問者: turinavi
●カテゴリ:コンピュータ 学習・教育
✍キーワード:00 postgreSQL SQL データ データベース
○ 状態 :終了
└ 回答数 : 3/3件

▽最新の回答へ

1 ● redcherry
●20ポイント

http://www.postgresql.jp/document/pg803doc/html/sql-syntax.html#...

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


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

ということですね。

◎質問者からの返答

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

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

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


2 ● redcherry
●20ポイント

http://www.hatena.ne.jp/

はてな

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のままコピペしちゃいました。

ごめんなさい。。。

◎質問者からの返答

先の回答と同じです。


3 ● teru2g
●20ポイント

http://dummy/

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’

◎質問者からの返答

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

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ