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

Konvertieren Sie „datetime2“ in „datetime“ in SQL Server (T-SQL-Beispiele)

Es gibt wahrscheinlich nur sehr wenige Anwendungsfälle, die Sie veranlassen würden, ein datetime2 zu konvertieren Wert auf datetime im SQL-Server. Insbesondere datetime2 Der Datentyp kann so eingestellt werden, dass er die gleiche Speichergröße wie datetime verwendet , aber mit höherer Genauigkeit. In den meisten Fällen sind Sie also mit datetime2 besser dran als mit einer datetime . Microsoft empfiehlt außerdem die Verwendung von datetime2 statt datetime .

Falls Sie sich jedoch in der Situation befinden, in der Sie diese Konvertierung durchführen müssen, enthält dieser Artikel einige Beispiele und Überlegungen, die hilfreich sein können.

Beim Konvertieren eines datetime2 Wert auf datetime , hängt der resultierende Wert von den Sekundenbruchteilen ab, die datetime2 zugewiesen wurden Wert sowie seine Genauigkeit.

Die datetime2 Datentyp ermöglicht es Ihnen, eine Genauigkeit von Sekundenbruchteilen von 0 bis 7 anzugeben. Wenn Sie dies nicht angeben, wird 7 (Standardeinstellung) verwendet.

Die datetime Der Datentyp hingegen hat maximal 3 Ziffern für seinen Sekundenbruchteil. Die Genauigkeit wird auf 0,000, 0,003 oder 0,007 Sekunden gerundet.

Wenn also datetime2 eine Skala von 3 verwendet, wird der resultierende Wert dem ursprünglichen Wert sehr nahe kommen (wenn nicht sogar identisch). Allerdings aufgrund der geringeren Genauigkeit von datetime , können die Ergebnisse aufgrund der Rundung abweichen.

Beispiel 1 – Implizite Konvertierung

Hier ist ein Beispiel für eine implizite Konvertierung zwischen datetime2 und datetime .

DECLARE 
  @thedatetime2 datetime2, 
  @thedatetime datetime;
SET @thedatetime2 = '2025-05-21 10:15:30.1234567';
SET @thedatetime = @thedatetime2;
SELECT 
  @thedatetime2 AS 'datetime2',
  @thedatetime AS 'datetime';

Ergebnis:

+-----------------------------+-------------------------+
| datetime2                   | datetime                |
|-----------------------------+-------------------------|
| 2025-05-21 10:15:30.1234567 | 2025-05-21 10:15:30.123 |
+-----------------------------+-------------------------+

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, datetime2 zuzuweisen Wert zu einem datetime Variable.

Wir können das datetime sehen Die Variable hat eine geringere Genauigkeit in Sekundenbruchteilen, und wir erhalten am Ende einen Bruchteil von 123 obwohl der ursprüngliche Bruchteil 1234567 war .

In diesem Fall wurde keine Rundung vorgenommen.

Beispiel 2 – Präzision/Genauigkeit und Rundung

Die datetime Der Datentyp wird auf Schritte von 0,000, 0,003 oder 0,007 Sekunden gerundet. Auch wenn Sie ihn explizit auf einen anderen Wert setzen, wird er gerundet.

Dies gilt auch bei der Konvertierung von einem anderen Datentyp (wie wir es hier tun).

Hier ist ein Beispiel, das demonstriert, was ich meine.

DECLARE 
  @thedatetime2 datetime2, 
  @thedatetime datetime;
SET @thedatetime2 = '2025-05-21 10:15:30.1256789';
SET @thedatetime = @thedatetime2;
SELECT 
  @thedatetime2 AS 'datetime2',
  @thedatetime AS 'datetime';

Ergebnis:

+-----------------------------+-------------------------+
| datetime2                   | datetime                |
|-----------------------------+-------------------------|
| 2025-05-21 10:15:30.1256789 | 2025-05-21 10:15:30.127 |
+-----------------------------+-------------------------+

In diesem Beispiel setze ich die Sekundenbruchteile von datetime2 Wert auf 1256789 sondern datetime aufgerundet auf 127 (da nur auf 0,000, 0,003 oder 0,007 Sekunden gerundet werden kann).

Es ist wichtig zu beachten, dass dies immer noch zutrifft, selbst wenn wir datetime2 nur 3 Sekundenbruchteile zuweisen Wert.

Beispiel:

DECLARE 
  @thedatetime2 datetime2(3), 
  @thedatetime datetime;
SET @thedatetime2 = '2025-05-21 10:15:30.125';
SET @thedatetime = @thedatetime2;
SELECT 
  @thedatetime2 AS 'datetime2',
  @thedatetime AS 'datetime';

Ergebnis:

+-------------------------+-------------------------+
| datetime2               | datetime                |
|-------------------------+-------------------------|
| 2025-05-21 10:15:30.125 | 2025-05-21 10:15:30.127 |
+-------------------------+-------------------------+

Es lohnt sich auch, auf eventuelle Rundungen des ursprünglichen datetime2 zu achten Wert. Die datetime2 Der Wert selbst könnte aufgerundet werden, wenn wir versuchen, einen Wert mit mehr Bruchteilen von Sekunden als seiner eigenen Skala zuzuweisen.

Beispiel:

DECLARE 
  @thedatetime2 datetime2(3), 
  @thedatetime datetime;
SET @thedatetime2 = '2025-05-21 10:15:30.1256789';
SET @thedatetime = @thedatetime2;
SELECT 
  @thedatetime2 AS 'datetime2',
  @thedatetime AS 'datetime';

Ergebnis:

+-------------------------+-------------------------+
| datetime2               | datetime                |
|-------------------------+-------------------------|
| 2025-05-21 10:15:30.126 | 2025-05-21 10:15:30.127 |
+-------------------------+-------------------------+

In diesem Fall versuche ich, einen Wert mit einem Bruchteil von 1256789 zuzuweisen . Da jedoch datetime2(3) value hat nur eine Skalierung von 3, kann nur 3 Dezimalstellen unterstützen, und in diesem Fall wird die letzte Ziffer aufgerundet (weil die folgende Ziffer 5 oder höher ist).

Beide datetime2(3) und datetime verwenden die gleiche Menge an Speicherplatz (8 Byte). Die datetime2(3) Der Datentyp verwendet tatsächlich 7 Bytes zum Speichern der Daten, aber zusätzlich 1 Byte zum Speichern der Genauigkeit.

Beispiel 3 – 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, um explizit zwischen datetime2 zu konvertieren und datetime .

DECLARE @thedatetime2 datetime2;
SET @thedatetime2 = '2025-05-21 10:15:30.1234567';
SELECT 
  @thedatetime2 AS 'datetime2',
  CAST(@thedatetime2 AS datetime) AS 'datetime';

Ergebnis:

+-----------------------------+-------------------------+
| datetime2                   | datetime                |
|-----------------------------+-------------------------|
| 2025-05-21 10:15:30.1234567 | 2025-05-21 10:15:30.123 |
+-----------------------------+-------------------------+

Beispiel 4 – Explizite Konvertierung mit CONVERT()

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

DECLARE @thedatetime2 datetime2;
SET @thedatetime2 = '2025-05-21 10:15:30.1234567';
SELECT 
  @thedatetime2 AS 'datetime2',
  CONVERT(datetime, @thedatetime2) AS 'datetime';

Ergebnis:

+-----------------------------+-------------------------+
| datetime2                   | datetime                |
|-----------------------------+-------------------------|
| 2025-05-21 10:15:30.1234567 | 2025-05-21 10:15:30.123 |
+-----------------------------+-------------------------+