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

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

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

Lorsque vous convertissez un smalldatetime valeur à datetimeoffset , le smalldatetime la valeur est copiée dans datetimeoffset valeur. Les fractions de seconde sont définies sur 0 et le décalage de fuseau horaire est défini sur +00:0.

Le petitedateheure Le type de données n'a pas de fraction de seconde et son composant secondes est toujours défini sur zéro (:00). Sa précision est à la minute près.

Le datetimeoffset Le type de données, d'autre part, vous permet de spécifier une précision fractionnaire de secondes de 0 à 7. Si vous ne le spécifiez pas, il utilisera 7 (la valeur par défaut). Il a également un décalage de fuseau horaire et peut conserver tous les décalages dans la valeur d'origine. Cependant, smalldatetime 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 est défini sur +00:00.

SQL Server a en fait le TODATETIMEOFFSET() fonction, qui est spécifiquement conçue pour convertir une valeur de date/heure en datetimeoffset et ajoutez un décalage de fuseau horaire. Cependant, voir ci-dessous pour mes commentaires et quelques exemples concernant cette option.

Exemple 1 – Conversion implicite

Tout d'abord, voici un exemple de conversion implicite entre smalldatetime et 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)';

Résultat :

+---------------------+------------------------------------+
| smalldatetime       | datetimeoffset(7)                  |
|---------------------+------------------------------------|
| 2025-05-21 10:16:00 | 2025-05-21 10:16:00.0000000 +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 smalldatetime valeur à un datetimeoffset variables.

Nous pouvons voir que le datetimeoffset la variable a une partie fractionnaire ( 0000000 ), tandis que le smalldatetime La valeur n'a pas de partie décimale et ses minutes ont été arrondies lors de l'attribution de la valeur initiale. Le datetimeoffset la valeur inclut également 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 octets pour stocker les données, 1 octet pour la précision). En comparaison, smalldatetime utilise seulement 4 octets. Cependant, vous pouvez réduire la précision de datetimeoffset valeur en remplaçant le 7 par un chiffre inférieur. Si vous souhaitez supprimer complètement la fraction de seconde, utilisez simplement datetimeoffset(0) . Cela réduira la taille de stockage à 9 octets (dont 1 pour la précision).

Exemple 2 - 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 smalldatetime et 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)';

Résultat :

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

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

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

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

Résultat :

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

Exemple 4 - Modification du décalage horaire

Le fait que vous convertissez votre smalldatetime valeurs à datetimeoffset signifie que vous le faites probablement pour le décalage horaire. Et il est probable que vous souhaitiez qu'il soit défini sur un décalage différent de +00:00 (le décalage par défaut).

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

Vous pouvez également utiliser cette fonction pour convertir le smalldatetime d'origine valeur à un datetimeoffset valeur. Cette fonction accepte une valeur de date/heure (qui peut se résoudre en une datetime2 valeur) et une valeur de décalage.

Voici un exemple :

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';

Résultat :

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

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

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

Résultat :

+---------------------+------------------------------------+
| smalldatetime       | datetimeoffset                     |
|---------------------+------------------------------------|
| 2025-05-21 10:16:00 | 2025-05-21 10:16:00.0000000 +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é. Dans ce cas, il s'agit d'un smalldatetime argument, qui n'a pas de fraction de seconde.

Mon système renvoie des zéros de fin avec datetimeoffset partie fractionnaire, cependant, vous pourriez voir quelque chose comme ceci :

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

Quoi qu'il en soit, vous pouvez toujours profiter pleinement du datetimeoffset précision du type de données si vous devez modifier la valeur ultérieurement.

Voici un exemple qui utilise le DATEADD() fonction pour changer les fractions de secondes après que la conversion a déjà été effectuée.

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';

Résultat (en utilisant la sortie verticale) :

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