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

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

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

Lorsque vous convertissez un datetime2 valeur à datetimeoffset , la valeur résultante dépendra de la précision en fractions de seconde attribuée à chaque type de données, ainsi que de tout décalage de fuseau horaire que vous spécifiez.

Les deux types de données vous permettent de spécifier une précision fractionnaire de seconde de 0 à 7. Si vous ne le spécifiez pas, l'échelle par défaut de 7 est utilisée.

Le datetimeoffset Le type de données inclut un décalage de fuseau horaire et peut conserver tous les décalages dans la valeur d'origine. Cependant, datetime2 n'a pas de prise en compte du fuseau horaire, il n'y a donc pas de valeurs existantes à conserver. Dans ce cas, le décalage horaire par défaut est +00:00.

Le TODATETIMEOFFSET() la fonction a été spécialement conçue pour convertir une valeur de date/heure en datetimeoffset et ajoutez un décalage de fuseau horaire. Cependant, voir mes commentaires (et exemples) ci-dessous concernant cette option.

Exemple 1 – Conversion implicite

Tout d'abord, voici un exemple de conversion implicite entre datetime2 et datetimeoffset .

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

Résultat :

+-----------------------------+------------------------------------+
| datetime2                   | datetimeoffset(7)                  |
|-----------------------------+------------------------------------|
| 2025-05-21 10:15:30.1234567 | 2025-05-21 10:15:30.1234567 +00:00 |
+-----------------------------+------------------------------------+

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 datetime2 valeur à un datetimeoffset variables.

Nous pouvons voir que le datetimeoffset la variable peut utiliser la même précision que datetime2 valeur (7 décimales). Nous nous retrouvons également avec un décalage de fuseau horaire de +00:00 .

L'utilisation d'une précision de 7 fractions de seconde provoque datetimeoffset utiliser 11 octets pour le stockage (10 pour les données et 1 octet pour la précision). Le datetime2 type utilise 9 octets (8 pour les données et 1 octet pour la précision) lors de l'utilisation d'une échelle de 7.

Cependant, vous pouvez réduire la précision en remplaçant le 7 par un nombre inférieur.

Exemple 2 – Arrondi

Si datetimeoffset a une précision inférieure à datetime2 valeur, elle sera arrondie.

Voici un exemple :

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

Résultat :

+-----------------------------+------------------------------------+
| datetime2(7)                | datetimeoffset(6)                  |
|-----------------------------+------------------------------------|
| 2025-05-21 10:15:30.1234567 | 2025-05-21 10:15:30.1234570 +00:00 |
+-----------------------------+------------------------------------+

Dans cet exemple, le datetime2 la valeur a une échelle de 7 mais le datetimeoffset l'échelle de la valeur n'est que de 6. Par conséquent, sa précision n'est que de 6 décimales et son sixième chiffre est arrondi à 7 (au lieu de 6).

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 datetime2 et datetimeoffset .

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

Résultat :

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

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

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

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

Résultat :

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

Exemple 5 - Modification du décalage horaire

Si vous convertissez à partir de datetime2 à datetimeoffset , vous le faites probablement pour le décalage horaire. Il est également fort probable que vous ayez besoin d'une valeur autre que la valeur par défaut +00:00.

Heureusement, vous pouvez utiliser le TODATETIMEOFFSET() fonction pour modifier le décalage.

Vous pouvez également utiliser cette fonction pour convertir l'original datetime2 valeur à un datetimeoffset valeur. Cette fonction accepte toute valeur de date/heure pouvant être résolue en datetime2 valeur et une valeur de décalage.

Voici un exemple :

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

Résultat :

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

Et voici un exemple utilisant la fonction dans le SELECT déclaration :

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

Résultat :

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

Un point important sur le TODATETIMEOFFSET() est qu'elle utilise la même précision fractionnaire que l'argument date/heure qui lui est passé.

Par conséquent, si votre datetime2 utilise une précision inférieure à datetimeoffset , vous pouvez toujours le réaffecter à une variable avec une précision supérieure, puis passer cette valeur convertie à TODATETIMEOFFSET() .

Exemple :

DECLARE @lowprecision datetime2(3), @highprecision datetime2(7);
SET @lowprecision = '2025-05-21 10:15:30.123';
SET @highprecision = @lowprecision;
SELECT 
  @lowprecision AS 'lowprecision',
  @highprecision AS 'highprecision',
  TODATETIMEOFFSET(@highprecision, '+07:00') AS 'Modified';

Résultat (en utilisant la sortie verticale) :

lowprecision  | 2025-05-21 10:15:30.123
highprecision | 2025-05-21 10:15:30.1230000
Modified      | 2025-05-21 10:15:30.1230000 +07:00