0

真夜中過ぎに開いている飲酒バーのリストがあるAPIを構築しています。それらが現在開いているか閉じているかを確認するのに問題があります。

たとえば、これらのバーの 1 つの営業時間が次のようになっているとします。

Monday 
open time = 20:00
closed time = 05:00

Tuesday 
open time = 20:00
closed time = 04:00

バーが現在開いているかどうか、現在の時刻が 04:00 (月曜日が火曜日に進む) かどうかを知りたい場合、火曜日と閉店時間 = 04:00 であるため、現在のバーは閉まっているという結果になります。

しかし、実際の結果は、バーが 05:00 まで開いていることです (月曜日が火曜日に変わります)。

現在開いているか閉じているかを知る必要がある 20 以上のバーのリストがあります。これは mysql または php で実現できますか? データベーステーブルをどのようにセットアップすればよいですか?

私はこれを現在のセットアップとして持っています

テーブル名: openhours フィールド:

 id          int(11)
 bar_id      int(11)
 open_time   time
 close_time  time
 day         tinyint(1)

テーブル レコード:

 id: 1
 bar_id: 1
 open_time: 20:00:00
 closed_time: 05:00:00
 day: 0

 id: 2
 bar_id: 1
 open_time: 20:00:00
 closed_time: 04:00:00
 day: 1

このクエリは、午前 0 時を過ぎない営業日には正常に機能します

SELECT `open_time`, `closed_time`, IF(CURTIME() BETWEEN `open_time` 
AND `closed_time`,'open','closed') AS `status` FROM `openhours` 
WHERE `day` = DATE_FORMAT(NOW(), '%w')

しかし、過去の真夜中の問題についてどうすればいいですか?

このようなことを試みましたが、まったく正しくありません

  SELECT open_time, close_time, day, (CASE WHEN ((open_time <= close_time 
  AND open_time <= CURTIME() AND close_time >= CURTIME()) OR (open_time >= close_time 
  AND (CURTIME() <= close_time OR CURTIME() >= open_time))) THEN 'open' ELSE 'closed' 
  END) AS status FROM openhours WHERE bar_id = 2 and CASE WHEN (day = WEEKDAY(NOW())    
  AND (CURTIME() < open_time)) THEN CASE WHEN (day = (WEEKDAY(NOW()) - 1) 
  AND (CURTIME() < close_time)) THEN day = (WEEKDAY(NOW()) - 1) 
  ELSE day = WEEKDAY(NOW()) END ELSE day = WEEKDAY(NOW()) END

前もって感謝します!

4

3 に答える 3

0

あなたはこのようなものが欲しい

case closed < open
 not between open and closed
else 
 between open and closed 

どちらかが true を返すと、バーが開いています

于 2013-11-01T20:17:00.917 に答える
0

1 つのオプションは、週の始まりを過ぎた秒数を保存することです。これにより、真夜中をまったく心配する必要がなくなります。

これらをテーブルに追加します。

open_time_i   int(11)
closed_time_i int(11)

そして、データを次のようにします。

id: 1
bar_id: 1
open_time: 20:00:00
open_time_i: 72000
closed_time: 05:00:00
closed_time_i: 104400
day: 0

id: 2
bar_id: 1
open_time: 20:00:00
open_time_i: 158400
closed_time: 04:00:00
closed_time_i: 187200
day: 1

次に、ルックアップは次のようになります。

$seconds = time() - strtotime('this week last sunday', date("Y-m-d", time()))

SELECT `open_time`, `closed_time`, IF(
  $seconds BETWEEN `open_time_i` AND `closed_time_i`
    OR
  (("closed_time_i" >= 604800 AND $seconds BETWEEN 0 AND ("closed_time_i" - 604800)))
,'open','closed') AS `status` FROM `openhours`

2 番目の between ステートメントは、その週の変わり目を過ぎてバーが開いていたかどうかをチェックします。

于 2014-03-29T15:18:09.063 に答える