Memorizzando le ore un mercante è aperto in postgres

6

Nei postgres, ho bisogno di immagazzinare le ore in cui un mercante è aperto ogni settimana. In sostanza, le informazioni che vedresti pubblicate su un cartello nella porta del commerciante:

Mondays: Closed
Tuesday-Friday: 9am-1pm, 2pm-6pm
Weekends: 10am-2pm

Alcune idee finora:

  1. Analizza una settimana in blocchi di 30 minuti (o anche di 5 minuti) e usa un tipo di stringa di bit per memorizzare se il merchant è aperto durante quel chunk.
  2. Utilizza il tipo di array bidimensionale, un array "days", con ogni "giorno" e una serie di intervalli di ore quando il negozio era aperto.

Forse pertinente è ciò che i dati sarebbero usati per:

  1. Mostra all'utente tutte le ore dei commercianti, proprio come il segno del negozio sopra, su una pagina dei dettagli del commerciante.
  2. Indica se il negozio era aperto al momento.
  3. Indica la quantità di tempo fino alla successiva apertura del negozio.
  4. Probabilmente anche altre cose ...

Sto cercando consigli su come rappresentare questi dati in postgres.

    
posta Jonah 19.02.2016 - 19:06
fonte

3 risposte

4

La memoria più semplice sarebbe:

StoreID        integer (foreign key)
DayOfTheWeek   integer (range 0-6)
OpenTime       time
CloseTime      time
ValidFrom      date (starting date when this record is in use)
ValidThru      date (ending date when this record is in use, NULL for no ending date)

Tutti i campi sopra dovrebbero essere richiesti ( NOT NULL ). ValidThru potrebbe essere NULL a seconda di come si desidera contrassegnare un record come aperto.

A un certo punto, dovrai considerare i giorni di specialità (solitamente correlati a una festività) che potrebbero richiedere un campo data invece del campo DayOfTheWeek . Se lo fai, ricorda di applicare questi dati dopo aver creato gli orari di apertura dalla memoria sopra.

    
risposta data 19.02.2016 - 22:31
fonte
0

Vorrei memorizzare i dati come una serie di orari di inizio e fine, in cui ogni periodo può avere più voci. Puoi impostare il periodo come una stringa in cui il "periodo" è tutto ciò che vuoi essere, o è un giorno definito.

Il codice dovrà garantire che non si stiano inserendo dati sovrapposti, ma la lettura da questo sistema sarebbe molto semplice.

tabella :

field name | field type
------------------------------------------------
period     | string (ex: Monday, T/TH, Weekends)
start time | time   (ex: 01am; 02:30pm)
end time   | time   (ex: 01am; 02:30pm)
    
risposta data 19.02.2016 - 22:31
fonte
0

Ho programmato un sistema per l'elaborazione di turni per un fast food in cui abbiamo avuto lo stesso problema.

Penso che tu abbia perso il problema più difficile, ovvero i fusi orari e l'ora legale.

Se devi solo stampare le informazioni, il tipo di dati "time without timezone" dovrebbe andare bene, ma per qualsiasi calcolo di ore aperte o simili dovresti fare attenzione ai casi limite.

Abbiamo fatto ricorso a memorizzare l'ora e il minuto come ints. Ciò ha fornito una chiara indicazione degli "tempi di stampa" ma ha impedito l'uso improprio delle funzioni di data e ora.

Laddove tali calcoli fossero necessari, per prima cosa convertiremo all'UTC nel fuso orario pertinente nella data pertinente.

Inoltre, potrebbe essere necessario prendere in considerazione l'apertura e le chiusure multiple in un "giorno". Per una struttura completamente normalizzata avresti bisogno di:

[Store]
Id
Timezone

[Day]
Id
StartDate
StoreId

[OpenPeriod]
DayId
OpenHour
OpenMinute
CloseHour
CloseMinute

Nota: (se ricordo di più ora) i "giorni" possono essere più lunghi di 24 ore

Le ore sono "l'ora che l'orologio dice" non l'ora da mezzanotte o qualsiasi cosa

    
risposta data 20.02.2016 - 20:42
fonte