Cet article contient des exemples de conversion d'un datetimeoffset valeur à smalldatetime dans SQL Server.
Lorsque vous convertissez un datetimeoffset valeur à smalldatetime , la date et les heures sont copiées. Les minutes sont arrondies (en fonction de la valeur des secondes) et les secondes sont mises à 0.
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 (plus 1 octet pour la précision), selon la précision utilisée.
Le petitedateheure Le type de données, d'autre part, n'a pas de prise en compte du fuseau horaire et, par conséquent, il n'inclut aucun décalage de fuseau horaire. Il n'a pas non plus de fraction de seconde et son composant de secondes est toujours défini sur zéro (:00). Sa précision est à la minute près. La taille de stockage de ce type de données est fixée à 4 octets.
Exemple 1 – Conversion implicite
Voici un exemple de conversion implicite entre datetimeoffset et smalldatetime .
DÉCLARER @thedatetimeoffset datetimeoffset, @thesmalldatetime smalldatetime;SET @thedatetimeoffset ='2025-05-21 10:15:30.1234567 +07:00';SET @thesmalldatetime =@thedatetimeoffset;SELECT @thedatetimeoffset AS 'datetimeoffset', @thesmalldatetime AS 'smalldatetime';
Résultat :
+------------------------------------+--------- ------------+| datetimeoffset | petitedateheure ||------------------------------------------+---------- -----------|| 2025-05-21 10:15:30.1234567 +07:00 | 2025-05-21 10:16: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 datetimeoffset valeur à un smalldatetime variables.
Nous pouvons voir que le smalldatetime La variable n'a pas de précision en fractions de secondes et ses secondes ont été définies sur zéro. De plus, les minutes ont été arrondies, car la valeur d'origine avait une valeur de secondes de 30.
Une autre observation est que le décalage de fuseau horaire a été tronqué - le smalldatetime 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 lorsque vous comptez la précision) pour datetimeoffset , à 4 octets pour smalldatetime .
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 smalldatetime .
DECLARE @thedatetimeoffset datetimeoffset;SET @thedatetimeoffset ='2025-05-21 10:15:30.1234567 +07:00';SELECT @thedatetimeoffset AS 'datetimeoffset', CAST(@thedatetimeoffset AS smalldatetime) AS 'smalldatetime';Résultat :
+------------------------------------+--------- ----------------+| datetimeoffset | petitedateheure ||------------------------------------------+---------- ---------------|| 2025-05-21 10:15:30.1234567 +07:00 | 2025-05-21 10:16:00 |+--------------------------------------------------+- ------------------------+Exemple 3 - Conversion explicite à l'aide de CONVERT()
Voici un exemple de conversion explicite utilisant le
CONVERT()
fonction au lieu deCAST()
.DECLARE @thedatetimeoffset datetimeoffset;SET @thedatetimeoffset ='2025-05-21 10:15:30.1234567 +07:00';SELECT @thedatetimeoffset AS 'datetimeoffset', CONVERT(smalldatetime, @thedatetimeoffset) AS 'smalldatetime';Résultat :
+------------------------------------+--------- ----------------+| datetimeoffset | petitedateheure ||------------------------------------------+---------- ---------------|| 2025-05-21 10:15:30.1234567 +07:00 | 2025-05-21 10:16:00 |+--------------------------------------------------+- ------------------------+