La meilleure façon de stocker les données de date/heure dans SQL Server 2008 R2 et SQL Server Compact 4

Nous sommes à développer une application en C# 4 qui utilise SQL Server 2008 R2 dans le backend. SQL Server Compact 4 est également utilisé pour les clients déconnectés dans quelques très rares scénarios. Nous nous demandons quelle est la meilleure façon de stocker les données de date/heure dans ces bases de données, de sorte que:

  1. De données contenant les différents décalages temporels (venant de différents fuseaux horaires) peuvent co-exister bien. Cela signifie classés et comparés.
  2. De données dans SQL Server 2008 R2 et SQL Server Compact 4 peuvent être transférés de façon transparente; c'est une exigence secondaire qui ne doivent pas compromettre le design choisi.

Notre principale préoccupation est de préserver l'heure locale pour chaque événement enregistré, mais sans perdre la possibilité de comparer et de classer les évènements qui ont été générés à partir des fuseaux horaires différents et donc avoir différents décalages temporels.

Nous avons considéré le datetimeoffset type de données, car il stocke le décalage de temps et parce que cela correspond bien à l' .NET DateTimeOffset. Cependant, il n'est pas pris en charge dans SQL Server Compact 4. Une autre solution serait de supprimer l'offset des informations à partir de la base de données et l'utilisation d'un simple datetime type de données, de sorte que chaque morceau de données dans la base de données est normalisée, et les problèmes avec les Compact sont de moins en moins. Toutefois, cela introduit le problème de décalage d'info aurait besoin d'être reconstruit en quelque sorte sur la récupération avant que l'utilisateur voit les données.

Donc ma question est, existe-il des pratiques exemplaires et des directives sur la façon de stocker les valeurs de date/heure dans SQL Server, tenant compte du fait que nous allons devoir traiter avec des fuseaux horaires différents, et de faire de l'interopérabilité entre 2008 R2 et 4 Compact aussi facile que possible?

Merci.

Notez que datetimeoffset n'a pas vraiment de stocker une zone de temps - magasins de décalage. Que ne vous dit pas de fuseau horaire, il a été observé, c'est à dire que l'heure locale est de 10 minutes plus tard, lorsque le décalage ont changé. Ce sont ces valeurs censé représenter? Juste instants dans le temps? Fondamentalement, vous avez besoin de garder le décalage d'origine, ou vous êtes seulement intéressés à l'instant où quelque chose s'est produit?
Vous avez raison, je dois avouer que je n'avais pas regardé de cette façon. Nous sommes intéressés de connaître l'heure locale de l'événement, mais doivent également être en mesure de comparer les temps de chaque événement à d'autres événements qui peuvent avoir été produits à des endroits différents et, par conséquent, en vertu des fuseaux horaires différents (et donc ont des positions différentes).
Ok - si vous besoin de l'heure locale, alors vous avez besoin pour stocker le décalage d'une manière ou d'une autre. Ensuite, vous devez penser que vous devez être en mesure de requête ce sont les données sur l'heure locale - par exemple, vous pouvez stocker une valeur de type DateTime dans l'heure UTC et l'offset dans une colonne séparée... que ferait-il facile de l'ordre mondial, mais relativement difficile de rechercher localement...
Nous serions plutôt d'optimiser les locaux de fois qu'mondial de la comparaison de tri/classement. Peut-être le stockage DateTime dans de temps, et de compenser dans une colonne distincte? Ou, alternativement, DateTimeOffset? Toutes les lignes directrices et des pratiques exemplaires sur la façon dont SQL Server DateTimeOffset œuvres et s'intègre avec .NET?
L'utilisation de SqlServerCE est pourquoi je suggère de ne pas utiliser DateTimeOffset. Mais oui, vous pourrez utiliser un local de type DateTime et un décalage de soustraire pour obtenir de l'UTC.

OriginalL'auteur CesarGon | 2013-06-27