質問 |
||
| QNo.3356165 | 時間の比較をしたい | |
|---|---|---|
| 質問者:punipunipuniko |
たとえば データ(1) A:11時 B:13時 データ(2) A:18時 B:0時 データ(3) A:23時 B:3時 現在時刻が12時の場合 データ(1)が抽出 現在時刻が17時なら データ(2)(3)が抽出 現在時刻が0時なら データ(2)(3)が抽出 のように 現在時刻が期間AからBに該当する場合に データがHITするような SQLを作りたいのですが うまくいきません where 'now' between A and B; ではうまくいきませんでした 何か良いSQLはありませんか? ちなみにTIME型データです それ以外のデータ型でもいいです 希望通りの動きをするなら・・・ よろしくお願いします |
|
困り度:
|
||
| 質問投稿日時: 07/09/18 17:04 |
||
回答良回答20pt |
|
| ANo.3 | TIME型は24:00:00までしか入らないのですね。 ごめんなさい。 表示時間が0時に掛かる場合の検索条件をORで加えてみてはどうでしょう。 select * from test where (a <= b and a <= CURRENT_TIME AND CURRENT_TIME < b) or (a > b and (CURRENT_TIME < b or a <= CURRENT_TIME)); /* テストデータ */ insert into test values ('21:00:00', '2:00:00'); -- 9時から24時まで表示 insert into test values ('9:00:00', '0:00:00'); -- 0時から9時まで表示 insert into test values ('0:00:00', '9:00:00'); insert into test values ('15:00:00', '20:00:00'); /* 結果(試験時、22時30分)*/ a | b ----------+---------- 21:00:00 | 02:00:00 09:00:00 | 00:00:00 (2 rows) |
|---|---|
| 回答者:tecinfo | |
| 種類:回答 どんな人:専門家 自信:参考意見 |
|
| 回答日時: 07/09/19 22:45 |
|
| |
| 参考URL: | http://www.postgresql.jp/document/pg824doc/html/datatype-datetime.h... |
| この回答へのお礼 | ありがとうございます!! おかげさまで 希望通りの動きをすることができました! |
回答 |
|
| ANo.2 | PostgreSQL8.2.4です。 CURRENT_TIMEで現在の時間が得られます。 -- テスト用のテーブル create table test ( a time, b time ); -- テストデータ insert into test values ('9:00:00', '12:00:00'); insert into test values ('15:00:00', '20:00:00'); insert into test values ('9:00:00', '0:00:00'); insert into test values ('9:00:00', '24:00:00'); -- クエリ cre-at=> select * from test where a < CURRENT_TIME AND CURRENT_TIME < b; -- 結果(これを書いている時は12時前なので) a | b ----------+---------- 09:00:00 | 12:00:00 09:00:00 | 24:00:00 (2 rows) bが0時を過ぎる時は、「24時」のようにデータを挿入しないと検索されませんね。 |
|---|---|
| 回答者:tecinfo | |
| 種類:回答 どんな人:専門家 自信:参考意見 |
|
| 回答日時: 07/09/19 11:35 |
|
| |
| 参考URL: | http://www.postgresql.jp/document/pg824doc/html/functions-datetime.... |
| この回答への補足 | 解答ありがとうございます さっそく試してみたのですが insert into test values ('35:00:00', '12:00:00'); 上記のようにすると ERROR: date/time field value out of range: "35:00:00" となってしまいます。 insert into test values (to_timestamp('35:00:00','HH24MISS'),'12:00:00'); 上記のようにすると自動で変換されてデータは「11:00:00」扱いとなってしまいました データの型はtime型です データがそもそも入れれないので 動作を試すことができません。 |
| この回答へのお礼 | この回答にお礼をつける(質問者のみ) |
回答 |
|
| ANo.1 | >現在時刻が17時なら >データ(2)(3)が抽出 データ例から判断すると、矛盾していますが? >where now between A and B; nowは日時ですから、time型と直接比較できません。 time型なら、20時〜6時と行った場合、条件を二つに分ける必要があります。20:00:00〜23:59:59と、00:00:00〜06:00:00でです。timestamp型なら、こういった操作は不要ですが、別の日のデータはヒットしなくなります。 >何か良いSQLはありませんか? >それ以外のデータ型でもいいです >希望通りの動きをするなら・・・ 具体的なアドバイスが欲しいなら、やりたいことをもっと具体的にかつ正確に示してください。 |
|---|---|
| 回答者:chukenkenkou | |
| 種類:アドバイス どんな人:専門家 自信:参考意見 |
|
| 回答日時: 07/09/18 18:48 |
|
| |
| この回答への補足 | >現在時刻が17時なら >データ(2)(3)が抽出 は間違いですすみません。 やりたいのは 現在時刻が設定時刻Aから設定時刻Bの間ならHIT と言うことです。 設定時刻ABは共に自由に設定できて 入力できる数値は0〜23(時)です (もしくは24HMMSS) Aが0時 Bが23時の設定の場合もあれば Aが22時 Bが2時(26時)の場合もあります 設定期間内ならデータを抽出したいのです。 |
| この回答へのお礼 | この回答にお礼をつける(質問者のみ) |