web-dev-qa-db-fra.com

Les heures de stockage Un marchand est ouvert à Postgres

À Postgres, j'ai besoin de stocker les heures d'ouverture de l'heure d'ouverture d'un marchand à chaque semaine. Essentiellement, les informations que vous verriez postées sur une pancarte dans la porte du commerçant:

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

Quelques idées jusqu'à présent:

  1. Décomposer une semaine en morceaux de 30 minutes (ou même 5 minutes) et utilisez un type de chaîne de bits pour stocker si le marchand est ouvert pendant ce morceau.
  2. Utilisez du type de matrice à 2 dimensions, un tableau "Jours", avec chaque "jour" et une gamme de gammes d'heures lorsque le magasin était ouvert.

Peut-être pertinent est que les données seraient utilisées pour:

  1. Montrez à l'utilisateur toutes les heures des marchands, un peu comme le panneau de magasin ci-dessus, sur une page de détails du commerçant.
  2. Indiquez si le magasin était actuellement ouvert.
  3. Indiquez la quantité de temps jusqu'à ce que le magasin s'ouvre ensuite.
  4. Probablement d'autres choses aussi ...

Je cherche des conseils sur la manière de représenter ces données à Postgres.

8
Jonah

Le stockage le plus simple serait:

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)

Tous les champs ci-dessus doivent être nécessaires (NOT NULL). ValidThru pourrait être NULL Selon la manière dont vous souhaitez marquer un enregistrement comme étant ouvert fini.

À un moment donné, vous devrez envisager des journées spéciales (généralement liées à des vacances) pouvant avoir besoin d'un champ de date au lieu du champ DayOfTheWeek. Si vous le faites, n'oubliez pas d'appliquer ces données après avoir créé les heures d'ouverture à partir du stockage ci-dessus.

5
Adam Zuckerman

J'ai programmé un système pour élaborer des changements pour une prise de fast-food où nous avions le même problème.

Je pense que vous avez manqué le problème le plus difficile qui est des trimestres et des économies de temps.

Si vous n'avez qu'à imprimer les informations, le type de données "Heure sans trimzone" doit être correct, mais pour tout calcul des heures ouvertes ou similaires, vous devez être des cas de bord.

Nous avons eu recours à la conservation de l'heure et de la minute en tant qu'OB. Cela a donné une indication claire des "temps imprimables" mais empêchait toute utilisation abusive des fonctions de temps.

Lorsque de tels calculs étaient nécessaires, nous sommes d'abord convertis en UTC dans le fuseau horaire correspondant à la date correspondante.

De plus, vous devrez peut-être envisager une ouverture et une fermeture de la plate-forme dans un "jour". Pour une structure normalisée complète dont vous auriez besoin:

[Store]
Id
Timezone

[Day]
Id
StartDate
StoreId

[OpenPeriod]
DayId
OpenHour
OpenMinute
CloseHour
CloseMinute

Remarque: (je me souviens plus maintenant) des "jours" peut être plus long que 24h

Les heures sont "l'heure de l'horloge" dit pas heure depuis minuit ou quoi que ce soit

1
Ewan

Je stockerais les données comme une série de temps de début et d'arrêt, dans lesquels chaque période peut avoir plusieurs entrées. Vous pouvez configurer la période comme une chaîne dans laquelle la "période" est tout ce que vous voulez être ou est une journée définie.

Votre code devra veiller à ce que vous n'ayez pas entré dans des données qui se chevauchent, mais que la lecture de ce système serait très simple.

Tablea:

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)
0
Jacobm001