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

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

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

Lorsque vous convertissez un datetimeoffset valeur à datetime , les valeurs de date et d'heure sont copiées et le décalage de fuseau horaire est tronqué. Lorsque la précision fractionnaire de datetimeoffset est supérieure à trois chiffres, la valeur est tronquée.

Le datetimeoffset Le type de données vous permet de spécifier une précision fractionnaire de seconde de 0 à 7. Ceci est fait 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. Un autre octet est utilisé pour stocker la précision, ce qui ajoute 1 octet à ces chiffres.

La dateheure Le type de données, d'autre part, a un maximum de 3 chiffres pour sa partie fractionnaire de seconde. Sa précision est arrondie à des incréments de 0,000, 0,003 ou 0,007 seconde. Ce type de données n'a pas de prise en compte du fuseau horaire et, par conséquent, aucun décalage de fuseau horaire. Sa taille de stockage est de 8 octets.

Exemple 1 – Conversion implicite

Voici un exemple de conversion implicite entre datetimeoffset et dateheure .

DECLARE @thedatetimeoffset datetimeoffset, @thedatetime datetime;SET @thedatetimeoffset ='2025-05-21 10:15:30.1234567 +07:00';SET @thedatetime =@thedatetimeoffset;SELECT @thedatetimeoffset AS 'datetimeoffset', @thedatetime AS 'datetime';

Résultat :

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

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 datetime variables.

Nous pouvons voir que le datetime la variable a une précision inférieure à la fraction de seconde, et nous nous retrouvons avec une partie fractionnaire de 123 même si la partie fractionnaire d'origine était 1234567 .

Dans ce cas, aucun arrondi n'a été effectué.

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

Dans cette conversion, la taille de stockage a diminué de 10 octets (11 octets si vous incluez l'octet supplémentaire qui stocke la précision) pour datetimeoffset , à 8 octets pour datetime . Cependant, si le datetimeoffset value avait utilisé une échelle comprise entre 0 et 2, elle n'aurait utilisé que 8 octets (9 incluant la précision).

S'il avait utilisé une échelle de 3 (l'équivalent de la datetime valeur), la taille de stockage aurait été de 9 octets (10 avec précision). Cependant, sa précision aurait été supérieure à datetime . Bien sûr, la précision serait diminuée dès que nous l'aurions converti en datetime .

Exemple 2 - Précision/exactitude et arrondi

La dateheure Le type de données est arrondi à des incréments de 0,000, 0,003 ou 0,007 seconde. Même si vous le définissez explicitement sur une autre valeur, il sera arrondi.

Cela s'applique également lors de la conversion à partir d'un autre type de données (comme ce que nous faisons ici).

Voici un exemple qui illustre ce que je veux dire.

DECLARE @thedatetimeoffset datetimeoffset, @thedatetime datetime;SET @thedatetimeoffset ='2025-05-21 10:15:30.1250000 +07:00';SET @thedatetime =@thedatetimeoffset;SELECT @thedatetimeoffset AS 'datetimeoffset', @thedatetime AS 'datetime';

Résultat :

+------------------------------------+--------- ----------------+| datetimeoffset | dateheure ||--------------------------------------------------+---------- ---------------|| 2025-05-21 10:15:30.1250000 +07:00 | 2025-05-21 10:15:30.127 |+-----------------------------------------+- ------------------------+

Dans cet exemple, j'ai défini les fractions de seconde du datetimeoffset valeur à 1250000 mais datetime arrondi à 127 (car il ne peut être arrondi qu'à des incréments de .000, .003 ou .007 secondes).

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 dateheure .

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

Résultat :

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

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(datetime, @thedatetimeoffset) AS 'datetime'; 

Résultat :

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