2011-09-01 6 views
6

Projektuję tabelę SQL, aby przechowywać godziny pracy dla sklepów.Godziny projektowania operacji Tabela SQL

Niektóre sklepy mają bardzo proste godzin: od poniedziałku do niedzieli w godzinach od 9:30 do 10:00 PM

Inni są trochę bardziej skomplikowane. Rozważmy następujący scenariusz:

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. 

Jak zaprojektowałbyś stół (y)?

EDIT

będą wykorzystywane do wskazywania, czy jest on otwarty w wybranym przez użytkownika momencie godzinę.

Inna tabela może prawdopodobnie obsługiwać wszelkie wyjątki, takie jak święta.

Godziny pracy sklepu nie ulegną zmianie z tygodnia na tydzień.

Odpowiedz

6

Stół jak to będzie łatwe zarówno do wyjścia pan pisał, jak tylko wypalanie trochę do tyłu (otwarte tak/nie):

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

udogodnienia:

  1. Korzystanie 24-godzinny nie jest konieczne, ale sprawia, że ​​matematyka łatwiejsze.
  2. Identyfikator sklepu prawdopodobnie dołączy się do tabeli odnośników, w której przechowywane są informacje o sklepie
  3. ID dnia będzie tłumaczone na dzień tygodnia (1 = niedziela, 2 = poniedziałek itd.)

Aby zapytać o swoim zbiorze, po prostu: SELECT Day, Open, Close... (którą chcesz sformatować Open/Close oczywiście)

Aby zapytać ISOpen ?, tylko:

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

Czy musisz zrobić coś więcej niż tylko przechowywać i wyświetlać?

Myślę, że projekt, który musi powiedzieć, czy sklep jest otwarty w określonym czasie, musiałby zostać poinformowany o wszystkich możliwościach, w przeciwnym razie skończy się to niemożnością przyjęcia czegoś.

Co z wyjątkami urlopowymi?

Rozważałbym przechowywanie ich jako interwałów bazujących na czasie podstawowym (minuty od czasu 0 na tydzień).

Tak 0 oznacza północ w poniedziałek.

Interval 1 byłoby 0 - 1440

Interval 2 będzie 1890 - 2310

itp

Można łatwo przekonwertować wybrany użytkownik czas na minutę offsetowego i ustalić, czy był sklep otwarty.

Twoim jedynym problemem pozostała byłaby interpretacja wyświetlacz przyjazny dla wyświetlacza (prawdopodobnie niektóre obszerna logika, ale nie niemożliwe) i pokrywają się w czasie 10080 -> 0.

+0

Będziemy przechowywać wyjątki wakacyjne w innej tabeli. – Emil

+0

Będziemy używać godzin, aby zobaczyć, czy sklep jest otwarty w wybranym przez użytkownika czasie, więc nie jest to tylko do wyświetlania z powrotem na ekranie. – Emil

+1

@Emil Zobacz edytowaną koncepcję. –

3

myśleć o tym bardziej definiując ramy czasowe, dni/tygodnie są bardziej złożone, ponieważ mają reguły i określają początek i koniec.

Jak zdefiniowałbyś przedział czasowy?

jedno ograniczenie (Początek [czas i dzień]), jedno odniesienie 'czas trwania' (godzina, minuty, .. rozpiętości) *. Teraz przesunięcia (ramy czasowe) mogą rozciągać się na kilka dni i nie trzeba wykonywać złożonej logiki, aby wyodrębnić dane i wykorzystać je w obliczeniach.

**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

Rozważałem także czas trwania, ale może być trudniej ustalić, czy sklep jest otwarty o 1:00 w poniedziałek. Musimy sprawdzić zarówno w niedzielę, jak i w poniedziałek: – Emil

+0

'WYBIERZ PRZYPADKĘ W PRZYPADKU CZASU @dodajczasu MIĘDZY Otwartą I DataAdd (hh, czas trwania, Otwórz) TO 1 ELSE 0 KONIEC Z tabeli GDZIE sklep = @ Sklep' Nie jest trudny? –

+0

oświadczenie jest nieco bardziej skomplikowane. Potrzebujemy również dnia, więc musimy sprawdzić zarówno wybrany dzień, jak i poprzedni dzień, na wypadek gdyby czas ten skrócił się do dzisiaj. Jeśli więc sprawdzamy dla dnia = 1, musimy również sprawdzić, czy dzień = 7 ma przypadek, gdy otwarty + czas trwania> 24. – Emil