Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Konvertieren Sie „smalldatetime“ in „datetimeoffset“ in SQL Server (T-SQL-Beispiele)

Dieser Artikel enthält Beispiele für die Konvertierung einer smalldatetime Wert zu einem datetimeoffset Wert in SQL Server.

Beim Konvertieren einer smalldatetime Wert auf datetimeoffset , die smalldatetime Wert wird in datetimeoffset kopiert Wert. Die Sekundenbruchteile werden auf 0 gesetzt und der Zeitzonenoffset wird auf +00:0 gesetzt.

Die smalldatetime Der Datentyp hat keine Sekundenbruchteile und seine Sekundenkomponente ist immer auf Null (:00) gesetzt. Seine Genauigkeit ist minutengenau.

Der datetimeoffset Der Datentyp hingegen ermöglicht es Ihnen, eine Genauigkeit von 0 bis 7 in Sekundenbruchteilen anzugeben. Wenn Sie dies nicht angeben, wird 7 (Standardeinstellung) verwendet. Es hat auch einen Zeitzonen-Offset und kann alle Offsets im ursprünglichen Wert beibehalten. Allerdings smalldatetime hat kein Zeitzonenbewusstsein, daher müssen keine vorhandenen Werte beibehalten werden. In diesem Fall wird der Zeitzonenoffset auf +00:00 gesetzt.

SQL Server hat tatsächlich den TODATETIMEOFFSET() -Funktion, die speziell dafür entwickelt wurde, einen Datums-/Uhrzeitwert in datetimeoffset umzuwandeln und fügen Sie einen Zeitzonenoffset hinzu. Unten finden Sie jedoch meine Kommentare und einige Beispiele zu dieser Option.

Beispiel 1 – Implizite Konvertierung

Zunächst ist hier ein Beispiel für eine implizite Konvertierung zwischen smalldatetime und datetimeoffset .

DECLARE 
  @thesmalldatetime smalldatetime, 
  @thedatetimeoffset datetimeoffset(7);
SET @thesmalldatetime = '2025-05-21 10:15:30';
SET @thedatetimeoffset = @thesmalldatetime;
SELECT 
  @thesmalldatetime AS 'smalldatetime',
  @thedatetimeoffset AS 'datetimeoffset(7)';

Ergebnis:

+---------------------+------------------------------------+
| smalldatetime       | datetimeoffset(7)                  |
|---------------------+------------------------------------|
| 2025-05-21 10:16:00 | 2025-05-21 10:16:00.0000000 +00:00 |
+---------------------+------------------------------------+

Dies ist eine implizite Konvertierung, da wir keine Konvertierungsfunktion (wie die unten) verwenden, um sie explizit zu konvertieren. In diesem Fall führt SQL Server im Hintergrund eine implizite Konvertierung durch, wenn wir versuchen, smalldatetime zuzuweisen Wert zu einem datetimeoffset Variable.

Das sehen wir am datetimeoffset Variable hat einen Bruchteil ( 0000000 ), während die smalldatetime Der Wert hat keinen Bruchteil, und seine Minuten wurden bei der Zuweisung des Anfangswerts aufgerundet. Der datetimeoffset -Wert enthält auch einen Zeitzonen-Offset von +00:00 .

Die Verwendung einer Genauigkeit von 7 Sekundenbruchteilen verursacht datetimeoffset 11 Bytes für die Speicherung zu verwenden (10 Bytes zum Speichern der Daten, 1 Byte für die Genauigkeit). Im Vergleich dazu smalldatetime verwendet nur 4 Bytes. Sie können jedoch die Genauigkeit des datetimeoffset verringern Wert, indem Sie die 7 durch eine niedrigere Zahl ersetzen. Wenn Sie den Sekundenbruchteil vollständig entfernen möchten, verwenden Sie einfach datetimeoffset(0) . Dadurch wird die Speichergröße auf 9 Bytes reduziert (einschließlich 1 für die Genauigkeit).

Beispiel 2 – Explizite Konvertierung mit CAST()

Hier ist ein Beispiel für eine explizite Konvertierung. In diesem Fall verwende ich den CAST() Funktion direkt innerhalb des SELECT -Anweisung zum expliziten Konvertieren zwischen smalldatetime und datetimeoffset .

DECLARE @thesmalldatetime smalldatetime;
SET @thesmalldatetime = '2025-05-21 10:15:30.125';
SELECT 
  @thesmalldatetime AS 'smalldatetime',
  CAST(@thesmalldatetime AS datetimeoffset(7)) AS 'datetimeoffset(7)';

Ergebnis:

+---------------------+------------------------------------+
| smalldatetime       | datetimeoffset(7)                  |
|---------------------+------------------------------------|
| 2025-05-21 10:16:00 | 2025-05-21 10:16:00.0000000 +00:00 |
+---------------------+------------------------------------+

Beispiel 3 – Explizite Konvertierung mit CONVERT()

Hier ist ein Beispiel für eine explizite Konvertierung mit CONVERT() Funktion anstelle von CAST() .

DECLARE @thesmalldatetime smalldatetime;
SET @thesmalldatetime = '2025-05-21 10:15:30.125';
SELECT 
  @thesmalldatetime AS 'smalldatetime',
  CONVERT(datetimeoffset(7), @thesmalldatetime) AS 'datetimeoffset(7)';

Ergebnis:

+---------------------+------------------------------------+
| smalldatetime       | datetimeoffset(7)                  |
|---------------------+------------------------------------|
| 2025-05-21 10:16:00 | 2025-05-21 10:16:00.0000000 +00:00 |
+---------------------+------------------------------------+

Beispiel 4 – Ändern des Zeitzonen-Offsets

Die Tatsache, dass Sie Ihre smalldatetime konvertieren Werte zu datetimeoffset bedeutet, dass Sie es wahrscheinlich für den Zeitzonenversatz tun. Und es ist wahrscheinlich, dass Sie es auf einen anderen Offset als +00:00 (den Standard-Offset) einstellen möchten.

Glücklicherweise können Sie TODATETIMEOFFSET() verwenden Funktion zum Ändern des Offsets.

Sie können diese Funktion auch verwenden, um die ursprüngliche smalldatetime umzuwandeln Wert zu einem datetimeoffset Wert. Diese Funktion akzeptiert einen Datums-/Uhrzeitwert (der zu datetime2 aufgelöst werden kann Wert) und einen Offset-Wert.

Hier ist ein Beispiel:

DECLARE @thesmalldatetime smalldatetime, @thedatetimeoffset datetimeoffset;
SET @thesmalldatetime = '2025-05-21 10:15:30';
SET @thedatetimeoffset = TODATETIMEOFFSET(@thesmalldatetime, '+07:00');
SELECT 
  @thesmalldatetime AS 'smalldatetime',
  @thedatetimeoffset AS 'datetimeoffset';

Ergebnis:

+---------------------+------------------------------------+
| smalldatetime       | datetimeoffset                     |
|---------------------+------------------------------------|
| 2025-05-21 10:16:00 | 2025-05-21 10:16:00.0000000 +07:00 |
+---------------------+------------------------------------+

Und hier ist ein Beispiel für die Verwendung der Funktion innerhalb von SELECT Aussage:

DECLARE @thesmalldatetime smalldatetime = '2025-05-21 10:15:30';
SELECT 
  @thesmalldatetime AS 'smalldatetime',
  TODATETIMEOFFSET(@thesmalldatetime, '+07:00') AS 'datetimeoffset';

Ergebnis:

+---------------------+------------------------------------+
| smalldatetime       | datetimeoffset                     |
|---------------------+------------------------------------|
| 2025-05-21 10:16:00 | 2025-05-21 10:16:00.0000000 +07:00 |
+---------------------+------------------------------------+

Ein wichtiger Punkt zum TODATETIMEOFFSET() Funktion ist, dass sie die gleiche gebrochene Genauigkeit verwendet wie das an sie übergebene Datum/Zeit-Argument. In diesem Fall ist es ein smalldatetime Argument, das keine Sekundenbruchteile hat.

Mein System gibt nachgestellte Nullen mit datetimeoffset zurück Bruchteil, Sie könnten jedoch so etwas sehen:

+---------------------+----------------------------+
| smalldatetime       | datetimeoffset             |
|---------------------+----------------------------|
| 2025-05-21 10:16:00 | 2025-05-21 10:16:00 +07:00 |
+---------------------+----------------------------+

In jedem Fall können Sie den datetimeoffset voll ausnutzen die Genauigkeit des Datentyps, wenn Sie den Wert später ändern müssen.

Hier ist ein Beispiel, das DATEADD() verwendet Funktion, um die Bruchteile von Sekunden zu ändern, nachdem die Konvertierung bereits durchgeführt wurde.

DECLARE @thesmalldatetime smalldatetime, @thedatetimeoffset datetimeoffset(7);
SET @thesmalldatetime = '2025-05-21 10:15:30';
SET @thedatetimeoffset = TODATETIMEOFFSET(@thesmalldatetime, '+07:00');
SELECT 
  @thesmalldatetime AS 'smalldatetime',
  @thedatetimeoffset AS 'datetimeoffset',
  DATEADD(nanosecond, 123456700, @thedatetimeoffset) AS 'Modified';

Ergebnis (bei vertikaler Ausgabe):

smalldatetime  | 2025-05-21 10:16:00
datetimeoffset | 2025-05-21 10:16:00.0000000 +07:00
Modified       | 2025-05-21 10:16:00.1234567 +07:00