Les meilleures pratiques à l'économie de datetime & le fuseau horaire de l'info dans la base de données lorsque des données est la personne à charge sur datetime

Il y avait bien quelques questions à propos de l'enregistrement datetime & fuseaux horaires de l'info dans DB, mais plus sur le plan d'ensemble. Ici, je voudrais aborder un cas spécifique.

Spécifications du système

  • Nous avons un système de commande de la base de données
  • C'est un multi-locataire système où les locataires peuvent utiliser arbitraire du fuseau horaire (c'est arbitraire, mais seul fuseau horaire, par le locataire, enregistré dans les Locataires de la table une fois et ne change jamais)

D'affaires de la règle qui doit être couvert en DB

  • Lorsque le locataire des lieux un Ordre dans le système, numéro de commande obtient calculée sur la base de leurs locaux datetime (ce n'est pas littéralement un nombre, mais une sorte d'identifiant comme ORDR-13432-Year-Month-Day). Calcul précis n'est pas important pour le moment, il est juste important que c'est la personne à charge sur les locataires de locaux datetime
  • Nous aussi, nous voulons être en mesure de choisir toutes les Commandes, sur le système de niveau, placé entre certains UTC datetimes quel que soit le locataire (pour le régime général des statistiques/reporting)

Notre idée initiale

  • Notre idée initiale était de sauver UTC datetime à travers toute la DB et, bien sûr, de garder les locataires décalage horaire par rapport à UTC et avoir une application qui consomme DB toujours convertir datetimes à l'UTC, de sorte que DB toujours de fonctionner avec l'UTC.

Approche 1

  • Économie locale locataires datetime serait bien par le locataire, mais ensuite nous avons problème avec des requêtes comme:
    SELECT * FROM ORDERS WHERE OrderDateTime BETWEEN UTCDateTime1 AND UTCDateTime2
    

C'est problématique parce que OrderDateTime dans cette requête signifie autre moment dans le temps, basée sur le locataire. Bien sûr, cette requête peut inclure joindre à Tenants tableau locaux datetime décalage qui serait alors de calculer OrderDateTime à la volée pour faire des ajustements. C'est possible, mais vous ne savez pas si c'est une bonne façon de le faire?

Approche 2

  • D'autre part, lors de l'enregistrement de l'UTC datetime, puis, quand nous faisons le calcul de OrderNumber depuis le jour/mois/année à l'UTC peut différer de celui en local datetime

Prenons l'exemple extrême, disons que le locataire est 6 heures à l'avance de l'heure UTC et son datetime local est 2017-01-01 02:00.
UTC serait 2016-12-31 20:00. Commande passée à l'instant devriez obtenir OrderNumber 'ORDR-13432-2017-1-1' mais si l'enregistrement de l'UTC il se ORDR-13432-2016-12-31.

Dans ce cas, au moment de la création de l'Ordre dans la DB, nous devons obtenir de l'UTC datetime, les locataires d'offset et de compiler OrderNumber basé sur recalculé les locataires localtime mais encore sauver la colonne DateTime au format UTC.

Questions

  1. Quel est le meilleur moyen de gérer ce genre de situation?
  2. Est-il une solution sympa à économiser de l'UTC datetimes parce que l'un serait assez gentil pour nous, à cause du système de déclaration?
  3. Si vous allez à l'économie de l'UTC, est l'Approche 2) une bonne façon de gérer les cas ou est-il une meilleure/recommandé?

[Mise à JOUR]

Sur la base des commentaires de Gerard Ashton et Hugo:

Question initiale n'était pas claire en ce qui concerne le détail, si le locataire peut changer le fuseau horaire ou pas et ce qui se passe si l'autorité politique change le fuseau horaire de propriétés ou de certains terirory du fuseau horaire.
Bien sûr, cela est d'une extrême importance, mais elle n'est pas au centre de cette question . On pourrait répondre que, dans une question distincte.

Pour le bien de cette question, permet de supposer locataire ne va pas changer d'emplacement. Le fuseau horaire de propriétés ou de fuseau horaire lui-même pour que le lieu peut changer, et ces changements seront traitées dans le système séparément à partir de cette question.

L'hypothèse que l'heure locale de la zone ne change jamais est risqué. Si le fuseau horaire est stocké comme un nom normalisé (Heure normale de l'est) alors vous devez également garder une trace de début et dates de fin de l'heure d'été à travers l'histoire de la base de données. Si le produit est stocké en tant que numérique offset à partir de l'UTC, il va changer dans les zones touchées par l'heure d'été. En de rares occasions, une subdivision politique peut changer d'un fuseau horaire à un autre.
déclaration que "l'heure locale de la zone ne change jamais" est par locataire. cela signifie simplement qu'une fois que le locataire choisit de leur fuseau horaire, ils utilisent toujours que le fuseau horaire. avec tous les sous-jacents potentiels des changements de fuseau horaire.
Peut-être le moment question de la zone est hors de votre contrôle. Mais si j'étais locataire et le Congrès AMÉRICAIN et de la législature de l'état a décidé de changer le fuseau horaire de mon bureau de la Montagne du Temps à l'Heure Centrale, et le fournisseur de base de données ne serait pas me laisser changer le fuseau horaire dans la base de données, je serais malheureux. Êtes-vous garder une trace du temps de la zone comme un nom ou une valeur numérique?
Même si vous utilisez un nom de fuseau horaire, il n'y a aucune garantie qu'une région sera dans la même zone pour toujours - un nouvelle zone peut être créé pour cette région, ce qui signifie un nouveau nom (qui n'existait pas avant) sera utilisé pour faire référence à la région en termes de règles de zone (ce qui est le décalage entre l'heure UTC, lorsque l'heure d'été commence et se termine, etc) - un nouveau nom est créé lorsque la région décide d'avoir des règles différentes et de ses données historiques, devient différent de capter tous les horaires. Ça n'arrive pas tous les jours, mais vous devez toujours prendre en considération.
Il n'y a rien de mal avec l'aide d'une commande date de la commande. La normalisation ne s'applique pas, c'est surfait de toute façon...

OriginalL'auteur daneejela | 2017-07-07