2011-09-01 43 views
6

Tôi đang thiết kế một bảng SQL để lưu trữ giờ hoạt động cho các cửa hàng.Giờ thiết kế hoạt động Bảng SQL

Một số cửa hàng có giờ rất đơn giản: Thứ Hai đến Chủ Nhật từ 9:30 sáng đến 10:00 PM

Những người khác phức tạp hơn một chút. Vui lòng xem xét trường hợp sau:

Monday: Open All Day 
Tuesday: 7:30AM – 2:30PM & 4:15PM – 11:00 PM 
Wednesday: 7:00PM – 12:30 AM (technically closing on Thursday morning) 
Thursday: 9:00AM – 6:00PM 
Friday: closed. 

Bạn sẽ thiết kế bảng như thế nào?

EDIT

Thời gian sẽ được sử dụng để hiển thị nếu một cửa hàng được mở tại một người dùng được lựa chọn thời gian.

Một bảng khác có thể xử lý bất kỳ ngoại lệ nào, chẳng hạn như ngày lễ.

Giờ lưu trữ sẽ không thay đổi từ tuần này sang tuần khác.

Trả lời

6

Một bảng như thế này sẽ dễ dàng cho cả hai đầu ra bạn đăng, cũng như chỉ bắn một chút trở lại (mở yes/no?):

Store | Day | Open | Closed 
--------------------------- 
1  | 1 | 0000 | 2400 
1  | 2 | 0730 | 1430 
1  | 2 | 1615 | 2300 
... 

Các tính năng:

  1. Sử dụng 24 giờ là không cần thiết, nhưng làm toán dễ dàng hơn.
  2. ID cửa hàng có thể tham gia vào bảng tra cứu nơi bạn lưu trữ Thông tin cửa hàng
  3. ID ngày sẽ chuyển thành ngày trong tuần (1 = Chủ Nhật, 2 = Thứ hai, v.v.)

Để truy vấn cho dữ liệu của bạn, chỉ cần: SELECT Day, Open, Close... (bạn muốn định dạng Mở/Đóng rõ ràng)

Để truy vấn ISOpen ?, chỉ:

SELECT CASE WHEN @desiredtime BETWEEN Open AND Closed THEN 1 ELSE 0 END 
FROM table 
WHERE store = @Store 
2

Bạn có phải làm nhiều việc hơn là chỉ lưu trữ và hiển thị không?

Tôi nghĩ rằng một thiết kế cần phải nói nếu một cửa hàng được mở tại một thời điểm cụ thể sẽ phải được thông báo bởi tất cả các khả năng, nếu không, bạn sẽ không thể chứa một cái gì đó.

Còn ngoại lệ về kỳ nghỉ thì sao?

Tôi sẽ xem xét việc lưu trữ chúng như là khoảng thời gian dựa trên thời gian cơ bản (phút kể từ thời gian 0 trên một tuần).

Vì vậy, 0 là nửa đêm vào thứ Hai.

Interval 1 sẽ 0-1440

Interval 2 sẽ là 1890-2310

, vv

Bạn có thể dễ dàng chuyển đổi người dùng chọn thời gian vào một phút bù đắp và xác định xem một cửa hàng là mở.

còn lại sẽ được giải thích trong màn hình để hiển thị thân thiện (có thể là một số logic mở rộng, nhưng không phải bất khả thi) và chồng chéo Vấn đề duy nhất của bạn lúc 10080 -> 0.

+0

Chúng tôi sẽ lưu trữ ngoại lệ cho kỳ nghỉ ở một bảng khác. – Emil

+0

Chúng tôi sẽ sử dụng giờ để xem cửa hàng có mở tại thời điểm do người dùng chọn không, vì vậy nó không chỉ để hiển thị lại trên màn hình. – Emil

+1

@Emil Xem khái niệm đã chỉnh sửa. –

3

nghĩ về nó nhiều hơn như xác định khung thời gian, ngày/tuần phức tạp hơn, bởi vì chúng có các quy tắc và bắt đầu và dừng được xác định.

Bạn định nghĩa khung thời gian như thế nào?

một chế (Bắt đầu [Thời gian và ngày]), một tài liệu tham khảo 'Thời gian' (giờ, phút, .. của nhịp) *. Bây giờ các thay đổi (khung thời gian) có thể kéo dài nhiều ngày và bạn không phải làm việc logic phức tạp để trích xuất và sử dụng dữ liệu trong tính toán.

**Store_Hours** 

Store | Day | Open | DURATION 
--------------------------- 
1  | 1 | 0000 | 24 
1  | 2 | 0730 | 7 
1  | 2 | 1615 | 6.75 
... 
1  | 3 | 1900 | 5.5 
+0

Tôi cũng đang xem xét thời lượng, nhưng có thể khó xác định xem cửa hàng có mở cửa lúc 1:00 sáng thứ Hai hay không. Chúng ta cần phải kiểm tra cả hai chủ nhật và thứ hai – Emil

+0

'CHỌN TRƯỜNG HỢP KHI @desiredtime GIỮA Mở VÀ DateAdd (hh, thời gian, mở) THEN 1 ELSE 0 END FROM table WHERE store = @ Store' Không khó? –

+0

tuyên bố phức tạp hơn một chút. Chúng tôi cũng cần cả ngày, vì vậy chúng tôi cần kiểm tra cả ngày mong muốn và ngày hôm trước trong trường hợp thời gian bắt đầu vào ngày hôm nay. Vì vậy, nếu chúng tôi kiểm tra ngày = 1, chúng tôi cũng cần kiểm tra xem ngày = 7 có trường hợp khi mở + thời lượng> 24 hay không. – Emil

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