2011-11-22 33 views
5

Cách tốt nhất để lưu trữ thời gian mở và đóng cửa hàng trong cơ sở dữ liệu cũng như cách tính thời gian trong PHP?Làm cách nào để tìm hiểu xem cửa hàng mở cửa hay đóng cửa - giao dịch hàng giờ?

tôi đã đưa ra thiết kế bảng này:

+----+---------+----------+-----------+------------+ 
| id | shop_id | week_day | open_hour | close_hour | 
+----+---------+----------+-----------+------------+ 
| 1 |  3 |  1 | 15:00:00 | 23:00:00 | 
| 2 |  3 |  2 | 15:00:00 | 23:00:00 | 
| 3 |  3 |  3 | 18:00:00 | 02:00:00 | 
| 4 |  3 |  4 | 18:00:00 | 02:00:00 | 
| 5 |  3 |  5 | 18:00:00 | 03:00:00 | 
+----+---------+----------+-----------+------------+ 

+------------+---------+------+-----+---------+----------------+ 
| Field  | Type | Null | Key | Default | Extra   | 
+------------+---------+------+-----+---------+----------------+ 
| id   | int(11) | NO | PRI | NULL | auto_increment | 
| shop_id | int(11) | NO |  | NULL |    | 
| week_day | int(11) | NO |  | NULL |    | 
| open_hour | time | NO |  | NULL |    | 
| close_hour | time | NO |  | NULL |    | 
+------------+---------+------+-----+---------+----------------+ 

Ví dụ, vào hôm thứ Ba (week_day = 2) nó mở cửa vào 15:00 và đóng cửa tại 23:00 (thứ ba).

Vào thứ Tư (`week_day = 2 '), mở cửa lúc 6 giờ tối và đóng sau nửa đêm lúc 2 giờ sáng, thứ Năm. Thời gian đóng cửa lúc nửa đêm (00:00:00 hoặc sau) nên được lưu trữ trong cơ sở dữ liệu như thế nào?

Giả sử khách hàng muốn đặt hàng (shop_id = 3) lúc 10 giờ tối Thứ Ba, họ sẽ có thể làm như vậy theo dữ liệu của cơ sở dữ liệu. Tuy nhiên, nếu khách hàng muốn đặt hàng vào lúc 1 giờ sáng Thứ Năm nhưng cơ sở dữ liệu cho thấy week_day = 3, nó đóng tại 02:00:00

Làm cách nào để viết PHP để tìm hiểu xem cửa hàng có mở hay không? nó có vẻ phức tạp!

Tôi có cần thay đổi thiết kế bảng để viết dễ dàng hơn trong PHP không?

Trả lời

2

Bạn có thể xem xét đưa ra các thông tin bảng thực sự đúng

+----+---------+----------+-----------+------------+ 
| id | shop_id | week_day | open_hour | close_hour | 
+----+---------+----------+-----------+------------+ 
| 1 |  3 |  1 | 15:00:00 | 23:00:00 | 
| 2 |  3 |  2 | 15:00:00 | 23:00:00 | 
| 3 |  3 |  3 | 18:00:00 | 23:59:59 | 
| 4 |  3 |  4 | 00:00:00 | 02:00:00 | 
| 5 |  3 |  4 | 18:00:00 | 23:59:59 | 
| 6 |  3 |  5 | 00:00:00 | 02:00:00 | 
| 7 |  3 |  5 | 18:00:00 | 23:59:59 | 
| 8 |  3 |  6 | 00:00:00 | 03:00:00 | 
+----+---------+----------+-----------+------------+ 

Sau đó sử dụng các loại sau đây của (query này là dành cho thứ Ba 22:00 như bạn đề cập):

SELECT count(*) FROM `shop` 
WHERE week_day=3 
and open_hour<='22:00:00' 
and close_hour>='22:00:00' 
+0

Cảm ơn ví dụ: Nếu cửa hàng mở cửa từ 8 giờ tối đến 12 giờ sáng - có phải là 20:00:00 đến 23:59:59 không? –

+0

Cải thiện tốt cho strucutre. Với cấu trúc bảng này, bạn có thể sử dụng một SQL động hơn, giống như cái tôi đã gợi ý trong câu trả lời của mình. –

+0

@ user791022: Vâng, theo ý tưởng này. Bởi vì, ngày dương lịch tiến vào lúc 00:00:00 trong các máy. –

0

Như tôi có thể hiểu (và sửa tôi nếu tôi không hiểu), bạn nên kiểm tra xem thời gian giữa open_hour và 23:59 của ngày hiện tại, và giữa 00:00 và close_hour của ngày hôm sau.

Điều đó nên được thực hiện trên mã APP chứ không phải trên Cơ sở dữ liệu.

IMHO, bạn nói đúng với thiết kế DB của mình!

+0

Bạn có nghĩa là nó phải có hàng thứ hai nếu đóng cửa sau nửa đêm? ví dụ: nếu một cửa hàng mở cửa từ 6 giờ chiều đến 2 giờ sáng, vì vậy hàng đầu tiên nên từ 18:00 đến 23:59 và sau đó hàng thứ hai sẽ là 00:00 đến 02:00 ....? –

3

Tôi đoán bạn có thể làm một SQL-câu hỏi như thế này, và kiểm tra xem truy vấn trả lại bất kỳ kết quả:

SELECT * FROM opening_hours_table WHERE shop_id = your_shop_id AND week_day = WEEKDAY(NOW()) + 1 AND open_hour < NOW() AND close_hour > NOW() 

Nếu bạn nhận được một kết quả trở lại, thì trong thời hạn của bạn giờ mở cửa.

Chỉnh sửa: Thực hiện một vài sửa lỗi cú pháp cho SQL.

+0

Thời gian đóng cửa nửa đêm hoặc sau nửa đêm nên được lưu trữ như thế nào? xem kết quả cơ sở dữ liệu ví dụ của tôi. –

+0

Tệ của tôi, tôi đã không đọc đủ tốt, chỉ cần đọc hai hàng đầu tiên kết thúc tại 23. –

+0

@ user791022 nếu bạn sử dụng một bảng như một gợi ý trong câu trả lời của Sarwar, tôi tin rằng truy vấn này sẽ làm việc. –

Các vấn đề liên quan