アプリ版:「スタンプのみでお礼する」機能のリリースについて

たとえば

データ(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型データです

それ以外のデータ型でもいいです
希望通りの動きをするなら・・・

よろしくお願いします

A 回答 (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)

参考URL:http://www.postgresql.jp/document/pg824doc/html/ …
    • good
    • 0
この回答へのお礼

ありがとうございます!!

おかげさまで
希望通りの動きをすることができました!

お礼日時:2007/09/20 14:53

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時」のようにデータを挿入しないと検索されませんね。

参考URL:http://www.postgresql.jp/document/pg824doc/html/ …

この回答への補足

解答ありがとうございます

さっそく試してみたのですが

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型です

データがそもそも入れれないので
動作を試すことができません。

補足日時:2007/09/19 15:21
    • good
    • 0

>現在時刻が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はありませんか?
>それ以外のデータ型でもいいです
>希望通りの動きをするなら・・・

具体的なアドバイスが欲しいなら、やりたいことをもっと具体的にかつ正確に示してください。

この回答への補足

>現在時刻が17時なら
>データ(2)(3)が抽出
は間違いですすみません。

やりたいのは

現在時刻が設定時刻Aから設定時刻Bの間ならHIT

と言うことです。

設定時刻ABは共に自由に設定できて
入力できる数値は0~23(時)です
(もしくは24HMMSS)

Aが0時 Bが23時の設定の場合もあれば
Aが22時 Bが2時(26時)の場合もあります

設定期間内ならデータを抽出したいのです。

補足日時:2007/09/19 09:48
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

関連するカテゴリからQ&Aを探す