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

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

Si vous avez un datetimeoffset valeur, mais vous n'avez pas besoin de la partie de décalage horaire et de fuseau horaire, en la convertissant en date vous fera économiser beaucoup d'espace de stockage (tout en supprimant les détails inutiles de la valeur). Cet article contient des exemples de conversion d'un datetimeoffset valeur à une date valeur dans SQL Server.

Le datetimeoffset Le type de données inclut la date et l'heure avec un décalage de fuseau horaire. Il a également une fraction de seconde comprise entre 0 et 7 (cela dépend du nombre de fractions de seconde qui lui sont attribuées). Ceci est fait en utilisant le datetimeoffset(n) syntaxe. Si vous ne le spécifiez pas, il utilisera 7 (valeur par défaut). La taille de stockage de ce type de données est de 8, 9 ou 10 octets (plus 1 octet pour stocker la précision), selon la précision utilisée. Sa précision est de 100 nanosecondes.

La date type de données, d'autre part, n'inclut que la date. Il n'inclut pas l'heure et sa précision est de 1 jour. Il utilise 3 octets pour le stockage.

Lorsque vous convertissez un datetimeoffset valeur à une date type de données, vous perdez la partie heure (y compris le décalage de fuseau horaire). Cependant, vous réduisez également la taille de stockage à 3 octets fixes. Bien sûr, vous n'effectuerez cette conversion que si vous n'avez pas besoin de la partie horaire et du décalage de fuseau horaire.

Exemple 1 – Conversion implicite

Voici un exemple de conversion implicite entre datetimeoffset et date .

DECLARE @thedatetimeoffset datetimeoffset, @thedate date;SET @thedatetimeoffset ='2025-05-21 10:15:30.1234567 +10:30';SET @thedate =@thedatetimeoffset;SELECT @thedatetimeoffset AS 'datetimeoffset', @thedate AS 'date';

Résultat :

+------------------------------------+--------- ---+| datetimeoffset | date ||------------------------------------------+---------- --|| 2025-05-21 10:15:30.1234567 +10:30 | 2025-05-21 |+-----------------------------------------+------ ------+

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 à une date variables.

Ici, nous pouvons voir que la date La valeur inclut uniquement la date (sans le composant d'heure). Le composant horaire, y compris son décalage horaire, a été supprimé de la valeur.

Dans cet exemple, le datetimeoffset value utilise la précision par défaut (qui se traduit par 7 décimales). Il en résulte que le type de données utilise 10 octets (en fait, 11 octets si vous comptez l'octet supplémentaire qui stocke la précision). La date la valeur utilise seulement 3 octets.

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

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

Résultat :

+------------------------------------+--------- ---+| datetimeoffset | date ||------------------------------------------+---------- --|| 2025-05-21 10:15:30.1234567 +10:30 | 2025-05-21 |+-----------------------------------------+------ ------+

Exemple 3 - 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 +10:30';SELECT @thedatetimeoffset AS 'datetimeoffset', CONVERT(date, @thedatetimeoffset) AS 'date'; 

Résultat :

+------------------------------------+--------- ---+| datetimeoffset | date ||------------------------------------------+---------- --|| 2025-05-21 10:15:30.1234567 +10:30 | 2025-05-21 |+-----------------------------------------+------ ------+