2012-03-03 91 views
7

在PHP和MySQL中 - 如何確定商店是打開還是關閉(返回true或false)?確定商店是否開放?

如果商店關閉,如何獲得下一個營業時間?

Opening_Hours表中的實施例:

+----+---------+----------+-----------+------------+---------+ 
| id | shop_id | week_day | open_hour | close_hour | enabled | 
+----+---------+----------+-----------+------------+---------+ 
| 1 |  1 |  1 | 16:30:00 | 23:30:00 |  1 | 
| 2 |  1 |  2 | 16:30:00 | 23:30:00 |  1 | 
| 3 |  1 |  3 | 16:30:00 | 23:30:00 |  0 | 
| 4 |  1 |  4 | 16:30:00 | 23:30:00 |  1 | 
| 5 |  1 |  5 | 10:00:00 | 13:00:00 |  1 | 
| 6 |  1 |  5 | 17:15:00 | 00:30:00 |  1 | 
| 7 |  1 |  6 | 17:15:00 | 01:30:00 |  1 | 
| 8 |  1 |  7 | 16:30:00 | 23:30:00 |  0 | 
+----+---------+----------+-----------+------------+---------+ 

open_hourclose_hour是TIME類型字段。表設計好嗎?

當前倍的實施例:

  • 當前時間:星期二23:00, - 輸出:打開, '打開在星期二16:30 - 23:30'

  • 當前時間:週二23:40, - 輸出:關閉, '打開在週四16:30 - 23:30'

公開賽週四因爲Opening_Hours.week_day = 3被禁用


現在如何處理午夜時間?這變得更加複雜。

正如你所看到的,上週六(Opening_Hours.week_day = 5),它是開放的,從17:15到下午01:30(閉第二天星期日)

如果當前時間爲週日上午1點15分,那麼商店仍將基於Opening_Hours.week_day = 5開放。

輸出:打開「在打開週六17:15 - 01:30」

+0

請不要在一次發佈多個問題。將問題制動成更小的部分並提出具體問題。此外,這看起來像是作業,這是不歡迎在這裏... – 2012-03-03 12:54:56

+5

@JanHančič這不是一次多個問題。我的問題是如何找出商店是打開還是關閉。其次,這不是功課。 – user1246800 2012-03-03 13:04:19

+0

它看起來像我的功課,但如果你說它不是那麼我相信你:) – 2012-03-03 14:11:00

回答

3

在過去,我已經使用時間戳沒有日期(秒從午夜開始)來處理這一點。因此,對於週六,開盤價爲62100,收盤價爲91800

我的想法是,這樣可以在接近午夜時刪除一些所需的邏輯,因爲您只需比較從日期開始到時間範圍的秒數。

而且很容易檢查它是否仍然從'昨天'打開 - 只需將86400添加到當前'時間'(自一天開始以來的秒數),並檢查前一天。

可能是所有的單個SQL語句。

1

您可以使用PHP date()函數並將其與開放時間進行比較。

你可以做這樣的事情遞歸函數(不工作的PHP代碼,但PHP與僞代碼組合):

/* $current_time should be in the format of date("His") */ 
function check_hours($current_day, $current_time) 
{ 
    Get the MySQL row for today here 

    if (Opening_Hours.enabled == 1 WHERE Opening_Hours.week_day == $current_day) 
    { 
     if ((date("His") >= Opening_Hours.open_hour) and ($current_time <= Opening_Hours.close_hour)) 
     { 
      // convert_numeric_day_to_full_representation isn't a real function! make one 
      return 'Open: ' . convert_numeric_day_to_full_representation($current_day) . ' ' . Opening_Hours.open_hour . ' – ' . Opening_Hours.close_hour; 
     } 
     elseif (date("His") < Opening_Hours.open_hour) 
     { 
      return 'Closed: Next opening hours: ' . convert_numeric_day_to_full_representation($current_day) . ' ' . Opening_Hours.open_hour . ' – ' . Opening_Hours.close_hour; 
     } 
     else 
     { 
      return check_hours($tomorrow, '000000'); 
     } 
    } 
    else 
    { 
     return check_hours($tomorrow, '000000'); 
    } 
}