Cet article contient des exemples de conversion d'un datetime2 valeur à un smalldatetime valeur dans SQL Server.
L'un des avantages de la conversion d'un datetime2 valeur à smalldatetime consiste à réduire la taille de stockage de 7, 8 ou 9 octets à 4 octets. Cependant, vous perdez en précision.
Le datetime2 Le type de données 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). Si vous spécifiez zéro (0
), sa précision sera à la seconde près.
Le petitedateheure Le type de données, d'autre part, n'a pas 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.
Lorsque vous convertissez un datetime2 valeur à smalldatetime , la date et une partie de l'heure sont copiées. Le composant des secondes est défini sur zéro (quelle que soit la valeur d'origine du composant des secondes) et l'heure est arrondie à la minute la plus proche. Toutes les fractions de seconde sont supprimées.
Exemple 1 – Conversion implicite
Voici un exemple de conversion implicite entre datetime2 et smalldatetime .
DECLARE @thedatetime2 datetime2, @thesmalldatetime smalldatetime;SET @thedatetime2 ='2025-05-21 10:15:30.1234567';SET @thesmalldatetime =@thedatetime2;SELECT @thedatetime2 AS 'datetime2', @thesmalldatetime AS 'smalldatetime';
Résultat :
+-------------------------------------------+---------------- -----+| dateheure2 | petitedateheure ||-----------------------------+----------------- ----|| 2025-05-21 10:15:30.1234567 | 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 datetime2 valeur à un smalldatetime variables.
Dans cet exemple, nous pouvons voir que le smalldatetime n'inclut pas les fractions de seconde, les secondes ont été définies sur zéro et la minute a été arrondie.
Dans ce cas, la datetime2 value utilise une précision de 7. En effet, 7 est la valeur par défaut. Je n'ai pas spécifié de précision et c'est donc la valeur par défaut qui a été utilisée.
Mais cela aurait renvoyé le même résultat quelle que soit la précision que j'ai choisie. Même si je l'avais réduit à zéro (c'est-à-dire déclaré comme datetime2(0)
), il aurait toujours renvoyé le même résultat.
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 datetime2 et smalldatetime .
DECLARE @thedatetime2 datetime2(0);SET @thedatetime2 ='2025-05-21 10:15:30';SELECT @thedatetime2 AS 'datetime2', CAST(@thedatetime2 AS smalldatetime) AS 'smalldatetime';Résultat :
+---------------------+---------------------+| dateheure2 | petitedateheure ||---------------------+---------------------|| 2025-05-21 10:15:30 | 2025-05-21 10:16:00 |+---------------------+---------------- -----+Dans cet exemple, j'ai décidé d'utiliser une échelle de zéro pour le datetime2 valeur (c'est-à-dire
datetime2(0)
), cependant, cela n'affecte pas le résultat smalldatetime valeur.Exemple 3 - Conversion explicite à l'aide de CONVERT()
Voici un exemple de conversion explicite utilisant le
CONVERT()
fonction au lieu deCAST()
.DECLARE @thedatetime2 datetime2(0);SET @thedatetime2 ='2025-05-21 10:15:30';SELECT @thedatetime2 AS 'datetime2', CONVERT(smalldatetime, @thedatetime2) AS 'smalldatetime';Résultat :
+---------------------+---------------------+| dateheure2 | petitedateheure ||---------------------+---------------------|| 2025-05-21 10:15:30 | 2025-05-21 10:16:00 |+---------------------+---------------- -----+