2011-09-01 9 views
6

Sto progettando una tabella SQL per memorizzare ore di funzionamento per i negozi.Progettazione Orario di lavoro Tabella SQL

Alcuni negozi hanno orari molto semplici: Lunedi alla Domenica 9:30-22:00

Altri sono po 'più complicato. Si prega di prendere in considerazione il seguente scenario:

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. 

Come si progetta il tavolo (s)?

EDIT

Le ore saranno utilizzati per mostrare se un negozio è aperto alla volta selezionato dall'utente.

Una tabella diversa può probabilmente gestire eventuali eccezioni, come le festività.

Le ore di negozio non cambieranno di settimana in settimana.

risposta

6

una tabella come questa sarebbe facile sia per l'uscita avete inviato, così come solo sparare un po 'indietro (aperto sì/no?):

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

Caratteristiche:

  1. Utilizzando 24 ore non è necessario, ma rende più facile la matematica.
  2. ID archivio verrebbe presumibilmente aggiunto a una tabella di ricerca in cui sono state memorizzate Informazioni negozio
  3. L'ID giorno si tradurrebbe in giorno della settimana (1 = domenica, 2 = lunedì, ecc.)

Per query per il set di dati, semplicemente: SELECT Day, Open, Close... (che ci si vuole formattare Open/Close, ovviamente)

per interrogare IsOpen ?, solo:

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

Devi fare molto più che archiviarlo e visualizzarlo?

Penso che un progetto che deve dire se un negozio è aperto in un determinato momento dovrebbe essere informato da tutte le possibilità, altrimenti, si finirà per non essere in grado di ospitare qualcosa.

E le eccezioni per le vacanze?

Prenderei in considerazione la possibilità di archiviarli come intervalli in base all'ora di base (minuti dal tempo 0 alla settimana).

Quindi 0 è la mezzanotte di lunedì.

Intervallo 1 sarebbe 0-1440

Intervallo 2 sarebbe 1890-2310

ecc

Si potrebbe facilmente convertire un tempo scelto dall'utilizzatore in un offset minuto e determinare se un negozio è stato Aperto.

Il vostro unico problema che rimane sarebbe interpretazione sul display per la visualizzazione amichevole (probabilmente una certa vasta logica, ma non impossibile) e si sovrappongono al momento 10080 -> 0.

+0

Memorizzeremo le eccezioni delle festività in una tabella diversa. – Emil

+0

Useremo le ore per vedere se un negozio è aperto in un momento selezionato dall'utente, quindi non è solo per la visualizzazione sullo schermo. – Emil

+1

@Emil Vedi il concetto modificato. –

3

Pensate a più come la definizione di intervalli temporali, i giorni/le settimane sono più complessi, perché hanno regole e definiti start e stop.

Come definiresti un intervallo di tempo?

un vincolo (Inizio [ora e giorno]), un riferimento 'Durata' (ore, minuti, .. della campata) *. Ora i turni (intervalli di tempo) possono estendersi su più giorni e non è necessario lavorare con la logica complessa per estrarre e utilizzare i dati nei calcoli.

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

Stavo anche considerando la durata, ma potrebbe essere più difficile determinare se un negozio è aperto alle 1:00 del lunedì. Dobbiamo controllare sia la domenica che il lunedì – Emil

+0

'SELEZIONARE CASO QUANDO @desiredtime TRA Open E DateAdd (hh, duration, Open) THEN 1 ELSE 0 END FROM table WHERE store = @ Store' Non è difficile? –

+0

la dichiarazione è un po 'più complicata. Abbiamo bisogno anche del giorno, quindi dobbiamo controllare sia il giorno desiderato, sia il giorno precedente nel caso in cui la durata arrivi a oggi. Quindi se stiamo controllando per day = 1, dobbiamo anche controllare se day = 7 ha un caso quando open + duration> 24. – Emil