2010-04-27 12 views
17

Trong cơ sở dữ liệu cửa hàng của tôi, tôi cần phải có giờ mở cửa. Bạn có một ý tưởng làm thế nào tôi có thể thực hiện điều này trong dB của tôi?SQL cho giờ mở cửa

Việc mở giờ là từ thứ hai đến chủ nhật, mỗi ngày có thể có 2 cửa sổ mở (ví dụ: 09: 00-12: 00, 16: 00-19: 00)

Trả lời

32

xây dựng bảng khác, gọi nó là schedules, thêm khóa ngoại vào shops khóa chính của bảng, trường Day of week, time_open, time_closed. Các dữ liệu cần tìm kiếm một cái gì đó như thế này:

shop_id  day_of_week  time_open  time_closed 
1   1    09:00   12:00 
1   1    16:00   19:00 
1   2    09:00   12:00 
1   2    16:00   19:00 
1   3    09:00   12:00 
1   3    16:00   19:00 
1   6    10:00   14:00 
2   1    09:00   12:00 
2   1    13:00   18:00 

Điều này sẽ cho bạn cơ hội để xây dựng bất kỳ loại lịch, với càng nhiều cửa sổ như bạn muốn, với bao nhiêu trường hợp ngoại lệ mà bạn cần. Đó là phổ quát, chỉ giới hạn trong thực tế là nó hy vọng tất cả các tuần để được giống hệt nhau. Không có ngày nghỉ được xem xét, cũng như lịch biểu kỳ quặc/cả tuần mà ai đó có thể sử dụng.

Edit:
Với câu hỏi Julien, khoảng giờ của một doanh nghiệp làm việc ban đêm, nó đã đến với sự chú ý của tôi rằng giải pháp trước đây không phải là bu tốt nhất đến nay. Bạn không thể mở một quán bar lúc 20:00, đóng cửa lúc 06:00 và so sánh nếu thời gian hiện tại (02:45) nằm trong khoảng thời gian này, bởi vì sẽ không có. Đó là lý do tại sao, nó sẽ là thuận tiện nhất để đăng ký không phải là thời gian đóng cửa, nhưng tổng thời gian làm việc, trong đơn vị đo lường thuận tiện (ví dụ phút).

shop_id  day_of_week  time_open  working_time 
1   1    09:00   180 
1   1    16:00   180 
1   2    09:00   180 
1   2    16:00   180 
1   3    09:00   180 
1   3    16:00   180 
1   6    10:00   240 
2   1    09:00   180 
2   1    13:00   300 
+1

điều này sẽ cho phép bạn thêm lịch thứ ba cho một ngày cụ thể, nếu vi phạm quy tắc của bạn, bạn cần phải kiểm soát chặt chẽ việc thêm lịch biểu mới để kiểm tra điều đó ... hoặc bạn có thể thêm " sched_num "cột với một ràng buộc kiểm tra rằng nó là 0 hoặc 1 và một ràng buộc duy nhất trên day_of_week và sched_num. –

+1

là cách tốt hơn để xử lý giờ mở cửa cho đêm biz, như một quán bar, mở cửa từ 10:00 đến 04:00. Thêm hai mục nhập (ngày1: 22: 00-> 23:59 và ngày 2: 00: 00-> 04:00)? hoặc một mục (ngày1: 22: 00-> 04:00)? – Julien

+1

Câu hỏi thú vị. Trong trường hợp này sẽ là hợp lý nhất để tái tạo tình huống này. Xem phản hồi đã chỉnh sửa. – AlexanderMP

5

Bạn đang sử dụng loại cơ sở dữ liệu nào? Nếu đó là mysql, hãy đặt vào một trường kiểu "time". Sau đó, bạn có thể vượt qua nó lần và làm các thao tác cơ bản về thời gian sql trên chúng. Toàn bộ bài viết này giả định mysql.

Nếu chỉ có một cửa hàng và bạn biết nó sẽ không bao giờ phát triển, chỉ cần tạo một bảng gọi là lần bạn giữ thời gian cửa hàng mở. Sau đó, nếu bạn muốn xem liệu cửa hàng có mở hay không, chỉ cần kiểm tra thời gian hiện tại dựa vào một trong các phạm vi trong cơ sở dữ liệu.

Nếu có nhiều hơn một cửa hàng, hãy tạo một bảng có tên là "lần" và một bảng có tên là "cửa hàng". Trong bảng thời gian, các cột có thể là "mở" và "đóng" với id được gọi là "store_id". Bảng cửa hàng cũng cần một id. Sau đó, bạn chỉ có thể nói:

"SELECT open, close FROM times WHERE store_id=x" 

Điều này sẽ cung cấp cho bạn TẤT CẢ các khoảng thời gian liên kết với cửa hàng cụ thể.