- PR -

【Postgresql】 日にちをまたぐ場合の抽出

投稿者投稿内容
どんどん。
会議室デビュー日: 2008/10/22
投稿数: 7
投稿日時: 2008-10-22 02:44
はじめまして。
Postgresql7.4.19を使用しています。

深夜営業店舗の日にちをまたぐ営業時間の抽出で悩んでます。

例えば営業時間が朝の9時から深夜の3時までの場合のSELECT方法を教えてほしいのですが。
他サイトにも同じ質問がありましたが、MySQLのため、改めて質問させていただきました。

下記のようなデータがありますが、

shop |open_time |close_time
---------------------------------
A  |09:00 |21:00
--------------------------------
B  |17:00 |02:00←深夜2時

A店の場合の抽出はできますが、
$date = date("H:i");
SELECT * FROM shop WHERE open_time<'$date' AND close_time>'$date';

B店の抽出で悩んでいます。

お手数ですがご教授いただきますようお願いいたします。





[ メッセージ編集済み 編集者: どんどん。 編集日時 2008-10-22 02:45 ]

[ メッセージ編集済み 編集者: どんどん。 編集日時 2008-10-22 02:49 ]
Java僧
ぬし
会議室デビュー日: 2003/11/06
投稿数: 261
投稿日時: 2008-10-22 08:47
何をしたいのかいま一つわかりません。
例のSQLも$dateが何を示すのかわかりません。
Time型ではなくて、Date型にしてある特定の日(1970年1月1日:エポック)の
時刻としてデータベースには入れておけばよいのでは?
どんどん。
会議室デビュー日: 2008/10/22
投稿数: 7
投稿日時: 2008-10-22 09:42
すいません。補足します。

現在営業中のお店を検索するSQLを作成していますが、

$date = date("H:i"); //現在の時間
SELECT * FROM shop WHERE open_time<'$date' AND close_time>'$date';
(open_time、close_timeの型:TIME WITHOUT TIME ZONE)

例えば
20時にSQLを実行した場合、A店の場合は抽出されますが、B店は抽出されません。
B店も抽出されるSQL文をご教授いただきたいのですが、よろしくお願いいたします。



rain
ぬし
会議室デビュー日: 2006/10/19
投稿数: 549
投稿日時: 2008-10-22 09:55
こういうデータにしちゃう。
コード:

shop |open_time |close_time
---------------------------------
A  |09:00 |21:00
--------------------------------
B  |17:00 |26:00



で、深夜3時を27時としてクエリを実行する。

-----以下、追加
特定の時間でしか検索しないのなら、こっちでもいいか。
コード:

shop |open_time |close_time
---------------------------------
A  |09:00 |21:00
--------------------------------
B  |17:00 |24:00
--------------------------------
B  |00:00 |02:00



------ さらに考察
上の方法だと 0:00 で検索できないから、下のほうがいいかも。
検索に使う時間は、0:00 〜 23:59 の範囲にするという条件をつけて(24:00は0:00とみる)

[ メッセージ編集済み 編集者: rain 編集日時 2008-10-22 10:07 ]

[ メッセージ編集済み 編集者: rain 編集日時 2008-10-22 10:28 ]
King
ぬし
会議室デビュー日: 2008/06/20
投稿数: 284
投稿日時: 2008-10-22 09:58
open_time が 17:00 で
close_time が 次の日の 18:00 になるような事は
全く考慮しなくて大丈夫ですか?
どんどん。
会議室デビュー日: 2008/10/22
投稿数: 7
投稿日時: 2008-10-22 10:08
ご意見ありがとうございます。

Kingさま>>
24時間以上営業の場合は考慮しません。
武史
ベテラン
会議室デビュー日: 2007/09/21
投稿数: 71
投稿日時: 2008-10-22 10:21
postgresql の文法をよく知らないのでアイデアだけ。

基本は、rain さんのアプローチがいいと思いますが、
すでにデータが決まってしまっているのであれば、
そういうデータになるように加工してやるのがいいかと
思います。

1.if や、case のような文法がある場合。
 開店時間と、閉店時間を比較して、
 開店時間の方が早い場合は、そのまま、HH:MM の形式に文字列化。
 閉店時間の方が早い(日をまたいで営業してる)場合は、HH に 24 を足して、
 HH:MM の形式に文字列化。
 比較時間も HH:MM の形式にして、文字列で比較する。

2.if や、case のような文法がない場合。
 開店時間と、閉店時間を引数にして、上記のようなものを関数で作る。
どんどん。
会議室デビュー日: 2008/10/22
投稿数: 7
投稿日時: 2008-10-22 10:25
rainさま>>

24:00の場合、データをINSERTするときに、
23:59:59以上の登録ができるのでしょうか?

スキルアップ/キャリアアップ(JOB@IT)