Beste Weg zum speichern von Datum/Uhrzeit-Daten in SQL Server 2008 R2 und SQL Server Compact 4
Entwickeln wir eine Anwendung in C# 4, verwendet SQL Server 2008 R2 als backend. SQL Server Compact 4 ist auch zum trennen von clients in sehr wenigen Szenarien. Wir werden Fragen, was ist der beste Weg zum speichern von Datum/Uhrzeit der Daten in diese Datenbanken, so dass:
- Daten mit verschiedenen Zeit-offsets (kommen aus unterschiedlichen Zeitzonen) können co-existieren schön. Dies bedeutet, sortiert und verglichen werden.
- Daten in SQL Server 2008 R2 und SQL Server Compact 4 übertragen werden kann, hin und her nahtlos; dies ist eine sekundäre Anforderung, sollte keine Kompromisse eingehen, die gewählte Gestaltung.
Unser Hauptanliegen ist die Erhaltung der lokalen Uhrzeit für jedes Ereignis aufgezeichnet, aber ohne die Möglichkeit zu vergleichen und Sortieren der Ereignisse generiert wurden, aus unterschiedlichen Zeitzonen und haben daher unterschiedliche Zeit-offsets.
Haben wir überlegt, die datetimeoffset
Daten geben, da es speichert die Zeit-offset und weil es Karten schön .NET DateTimeOffset
. Es ist jedoch nicht unterstützt SQL Server Compact 4. Wäre eine alternative zum entfernen von offset-Informationen aus der Datenbank, und verwenden Sie eine einfache datetime
Daten geben, so dass jedes Stück von Daten in die Datenbank normalisiert ist, und die Probleme mit der Kompakten weniger. Jedoch, dies führt zu dem problem, dass sich offset-info müssten rekonstruiert werden irgendwie auf Abruf, bevor der Benutzer die Daten sieht.
Meine Frage ist also, gibt es irgendwelche best practices oder Richtlinien, wie zum speichern von Datum/Zeit-Werte in SQL Server, unter Berücksichtigung, dass wir brauchen, um den Umgang mit unterschiedlichen Zeitzonen, und die Interoperabilität zwischen 2008 R2 und Kompakt-4 so einfach wie möglich?
Danke.
Du hast Recht, ich muss zugeben, dass ich noch nicht sah es auf diese Weise. Wir sind daran interessiert zu wissen, die lokale Zeit des Ereignisses, sondern auch müssen in der Lage sein zu vergleichen die Zeit von jedem Ereignis andere Ereignisse, die möglicherweise generiert wurden, an verschiedenen Orten und daher unter unterschiedlichen Zeitzonen (und damit verschiedene offsets).
Okay - wenn Sie müssen die lokale Zeit, dann müssen Sie zum speichern der offset der einen oder anderen Weise. Als Nächstes müssen Sie darüber nachdenken, ob Sie brauchen, um in der Lage sein zu Abfrage diese Daten nach der lokalen Zeit - zum Beispiel, könnten Sie speichern einen DateTime-Wert in UTC und den Offsets in einer separaten Spalte... dass würde es einfach machen, um weltweit, aber relativ schwer für die Suche lokal...
Wir würden eher eine Optimierung für die lokale Zeit, als für den globalen Vergleich/Sortieren. Vielleicht speichern DateTime in local Zeit-und offset-als separate Spalte? Oder, alternativ, DateTimeOffset? Richtlinien/best practices auf, wie gut der SQL Server ist DateTimeOffset arbeitet und integriert mit .NET?
Die Verwendung von SqlServerCE ist, warum ich vorschlug, nicht mit DateTimeOffset. Aber ja, Sie könnte verwenden Sie eine DateTime-local und ein offset für subtrahieren, um die UTC.
InformationsquelleAutor CesarGon | 2013-06-27
Du musst angemeldet sein, um einen Kommentar abzugeben.
Es klingt wie die relevanten Punkte sind:
DateTimeOffset
Es klingt wie
DateTimeOffset
ist grundsätzlich die am besten geeignete Art in diesem Fall. Sie sollten sicherstellen, dass jeder in der Mannschaft ist klar, was es bedeutet, wenn - der offset ist der offset, wenn die Daten ursprünglich erhalten. Wenn Sie anzeigen wollen, dass der Augenblick in der Zeit in einem verschiedenen Zeitzone, die Sie effektiv benötigen, um wieder auf UTC, und finden Sie heraus, was das offset sein, dass die angezeigte Zeitzone. Es ist einfach zu verwirrt über diese Art der Sache 🙂Wenn Sie brauchen, um Pflege der Daten in SqlServerCE mit voller treue, werden Sie wahrscheinlich wollen ein DateTime-Feld und dann ein separates Feld für den offset (z.B. in Minuten oder als TimeSpan-wenn SqlServerCE unterstützt).
InformationsquelleAutor Jon Skeet
Sind Sie wahrscheinlich Recht auf Nutzung
DateTimeOffset
auf dem server. Vielleicht wollen Sie auch zu Lesen, meine Antwort auf DateTime vs DateTimeOffset.Auf dem client, wo Sie mit SQLCE, speichern Sie eine
DateTime
mit UTC-Werten. Beim senden der Daten zum server, können Sie die lokale Zeitzone des Clients zu bestimmen, dieDateTimeOffset
dass der UTC-Wert entspricht.Wenn es möglich ist, dass die Benutzer ändern Ihre Zeitzonen, dann könnten Sie auch brauchen, um zu speichern die Zeitzone-id in der client-Datenbank. Aber Sie würde nur verwenden Sie diese während der Konvertierung. Es gibt keine Notwendigkeit, senden Sie es zum server, es sei denn, Sie könnten Bearbeiten die Werte auf den server oder einen anderen client.
Versuchen Sie nicht, speichern Sie die Zeit auf dem client in der lokalen Zeit des Clients. Sie begegnen abiguities. Zum Beispiel, wenn die Sommerzeit rollt sich rückwärts, Sie wollen nicht zwei verschiedene mögliche UTC mal für den gleichen lokalen Zeit.
InformationsquelleAutor Matt Johnson
Warum nicht mit datetime und immer speichern Sie den Wert als UTC-Wert, dann können Sie es formatieren, um die end-Benutzer (Anzeige) Zeitzone bei Bedarf.
Gut, SQLCE unterstützt nur einen datetime-Wert, so dass die einzige andere option ist, um datetime-Werte in ein nchar(34) Spalte, mit dieser Formatierung: dto.ToString("yyyy-MM-dd HH:mm:ss.fffffff zzz", System.Globalisierung.CultureInfo.InvariantCulture)
😉 Auf jeden Fall, die Tatsache, dass SQLCE nicht unterstützt datetimeoffset ist ein guter Grund, gehen für ein all-over-datetime-Lösung und speichern der offset woanders, als Sie vermuten. Aber ich möchte mehr Optionen und haben einige Einblicke auf das, was vor-und Nachteile jeder option hätte.
InformationsquelleAutor ErikEJ