Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Convertir 'datetimeoffset' en 'datetime2' dans SQL Server (exemples T-SQL)

Cet article contient des exemples de conversion d'un datetimeoffset valeur à datetime2 dans SQL Server.

Lorsque vous convertissez un datetimeoffset valeur à datetime2 , la date et l'heure sont copiées dans datetime2 valeur et le fuseau horaire est tronqué. Les fractions de secondes sont également tronquées pour s'adapter si la précision de la destination est inférieure.

Le datetimeoffset le type de données vous permet de spécifier une précision fractionnaire de secondes de 0 à 7 en utilisant le datetimeoffset(n) syntaxe. Si vous ne le spécifiez pas, il utilisera 7 (valeur par défaut). Il a également un décalage de fuseau horaire. La taille de stockage de ce type de données est de 8, 9 ou 10 octets, selon la précision utilisée.

Le datetime2 le type de données vous permet également de spécifier une précision fractionnaire de secondes de 0 à 7 (en utilisant le datetime2(n) syntaxe). Il n'a pas de conscience de fuseau horaire. Sa taille de stockage est de 6, 7 ou 8, selon la précision utilisée.

Notez que les quantités de stockage répertoriées ici sont les quantités répertoriées dans la documentation Microsoft. Cependant, ces types de données utilisent également 1 octet pour stocker la précision. Par conséquent, ajoutez 1 octet aux quantités indiquées ici pour obtenir une image plus complète des besoins de stockage.

Exemple 1 – Conversion implicite

Voici un exemple de conversion implicite entre datetimeoffset et datetime2 .

DÉCLARER @thedatetimeoffset datetimeoffset, @thedatetime2 datetime2;SET @thedatetimeoffset ='2025-05-21 10:15:30.1234567 +07:00';SET @thedatetime2 =@thedatetimeoffset;SELECT @thedatetimeoffset AS 'datetimeoffset', @thedatetime2 AS 'datetime2';

Résultat :

+------------------------------------+--------- --------------------+| datetimeoffset | dateheure2 ||--------------------------------------------------+---------- -------------------|| 2025-05-21 10:15:30.1234567 +07:00 | 2025-05-21 10:15:30.1234567 |+-----------------------------------------+- ----------------------------+

Il s'agit d'une conversion implicite car nous n'utilisons pas de fonction de conversion (comme celles ci-dessous) pour la convertir explicitement. Dans ce cas, SQL Server effectue une conversion implicite dans les coulisses lorsque nous essayons d'attribuer le datetimeoffset valeur à un datetime2 variables.

Dans cet exemple, les deux types de données utilisent la précision par défaut (7 décimales). Par conséquent, la partie fractionnaire était 1234567 pour les deux résultats.

Nous voyons également que le décalage du fuseau horaire a été tronqué - le datetime2 le type de données n'a pas de prise en compte du fuseau horaire.

Dans cette conversion, la taille de stockage est passée de 10 octets (pour datetimeoffset ) à 8 octets (pour datetime2 ), mais notez que 1 octet est ajouté afin de stocker la précision.

Exemple 2 - Précision différente

Voici un exemple qui montre ce qui se passe si le datetime2 value utilise une précision inférieure au datetimeoffset valeur.

DECLARE @thedatetimeoffset datetimeoffset(7), @thedatetime2 datetime2(3);SET @thedatetimeoffset ='2025-05-21 10:15:30.1234567 +07:00';SET @thedatetime2 =@thedatetimeoffset;SELECT @thedatetimeoffset AS 'datetimeoffset', @thedatetime2 AS 'datetime2';

Résultat :

+------------------------------------+--------- ----------------+| datetimeoffset | dateheure2 ||--------------------------------------------------+---------- ---------------|| 2025-05-21 10:15:30.1234567 +07:00 | 2025-05-21 10:15:30.123 |+-----------------------------------------+- ------------------------+

Dans cet exemple, le datetimeoffset a une échelle de 7 mais le datetime2 la valeur a une échelle de seulement 3 . Par conséquent, les fractions de secondes ont été tronquées pour s'adapter.

Notez que cela peut entraîner un arrondi. Voici un exemple où la partie fractionnaire de datetime2 la valeur est arrondie à 124 .

DECLARE @thedatetimeoffset datetimeoffset(7), @thedatetime2 datetime2(3);SET @thedatetimeoffset ='2025-05-21 10:15:30.1235555 +07:00';SET @thedatetime2 =@thedatetimeoffset;SELECT @thedatetimeoffset AS 'datetimeoffset', @thedatetime2 AS 'datetime2';

Résultat :

+------------------------------------+--------- ----------------+| datetimeoffset | dateheure2 ||--------------------------------------------------+---------- ---------------|| 2025-05-21 10:15:30.1234567 +07:00 | 2025-05-21 10:15:30.124 |+-----------------------------------------+- ------------------------+

Exemple 3 - Conversion explicite à l'aide de CAST()

Voici un exemple de conversion explicite. Dans ce cas, j'utilise le CAST() fonction directement dans le SELECT déclaration pour convertir explicitement entre datetimeoffset et datetime2 .

DECLARE @thedatetimeoffset datetimeoffset;SET @thedatetimeoffset ='2025-05-21 10:15:30.1234567 +07:00';SELECT @thedatetimeoffset AS 'datetimeoffset', CAST(@thedatetimeoffset AS datetime2) AS 'datetime2'; 

Résultat :

+------------------------------------+--------- --------------------+| datetimeoffset | dateheure2 ||--------------------------------------------------+---------- -------------------|| 2025-05-21 10:15:30.1234567 +07:00 | 2025-05-21 10:15:30.1234567 |+-----------------------------------------+- ----------------------------+

Exemple 4 - Conversion explicite à l'aide de CONVERT()

Voici un exemple de conversion explicite utilisant le CONVERT() fonction au lieu de CAST() .

DECLARE @thedatetimeoffset datetimeoffset;SET @thedatetimeoffset ='2025-05-21 10:15:30.1234567 +07:00';SELECT @thedatetimeoffset AS 'datetimeoffset', CONVERT(datetime2, @thedatetimeoffset) AS 'datetime2'; 

Résultat :

+------------------------------------+--------- --------------------+| datetimeoffset | dateheure2 ||--------------------------------------------------+---------- -------------------|| 2025-05-21 10:15:30.1234567 +07:00 | 2025-05-21 10:15:30.1234567 |+-----------------------------------------+- ----------------------------+