Cet article explore les principales différences entre le datetime et smalldatetime types de données dans SQL Server.
Les deux types de données sont utilisés pour stocker les valeurs de date et d'heure, cependant, il existe des différences entre les deux. Dans la plupart des cas, il vaut mieux éviter les deux types et utiliser datetime2 à la place (Microsoft le recommande également). Dans tous les cas, voici une comparaison de ces deux types de données.
Le tableau suivant présente certaines similitudes et différences clés entre ces deux types de données.
Fonctionnalité | smalldatetime | dateheure |
---|---|---|
Conformité SQL (ANSI et ISO 8601) | Non | Non |
Plage de dates | 1900-01-01 à 2079-06-06 | 1753-01-01 à 9999-12-31 |
Plage de temps | 00:00:00 à 23:59:59 | 00:00:00 à 23:59:59.997 |
Longueur des caractères | 19 postes maximum | 19 postes minimum 23 maximum |
Taille de stockage | 4 octets, fixe | 8 octets, fixe |
Précision | Une minute | Arrondi à des incréments de .000, .003 ou .007 secondes |
Précision fractionnaire de seconde | Non | Oui |
Précision fractionnaire de seconde définie par l'utilisateur | Non | Non |
Décalage du fuseau horaire | Aucun | Aucun |
Conscience et préservation du décalage horaire | Non | Non |
Respect de l'heure d'été | Non | Non |
Dois-je utiliser "datetime" ou "smalldatetime" ?
Microsoft déconseille d'utiliser ces deux types de données pour les nouveaux travaux. Vous ne devez les utiliser que si vous avez une bonne raison de le faire.
Mais si vous deviez choisir, votre décision serait probablement prise en évaluant la précision et l'exactitude supplémentaires de datetime par rapport aux exigences de stockage inférieures de smalldatetime .
En d'autres termes, si vous n'avez pas besoin de précision aux secondes, smalldatetime fera le travail en n'utilisant que la moitié de l'espace de stockage. D'un autre côté, si vous avez besoin d'une précision aux secondes (ou même à quelques fractions de secondes), vous devrez utiliser datetime .
Dans tous les cas, Microsoft recommande d'utiliser date , temps , dateheure2 , ou datetimeoffset pour un nouveau travail.
Voir smalldatetime vs datetime2 et dateheure vs datetime2 pour voir comment chacun de ces types se compare à datetime2 .
Exemple 1 - Comparaison de base
Voici un exemple rapide pour démontrer la différence fondamentale entre datetime et smalldatetime .
DECLARE @thedatetime datetime, @thesmalldatetime smalldatetime; SET @thedatetime = '2025-05-21 10:15:30.555'; SET @thesmalldatetime = @thedatetime; SELECT @thedatetime AS 'datetime', @thesmalldatetime AS 'smalldatetime';
Résultat :
+-------------------------+---------------------+ | datetime | smalldatetime | |-------------------------+---------------------| | 2025-05-21 10:15:30.557 | 2025-05-21 10:16:00 | +-------------------------+---------------------+
Ici, j'ai mis un smalldatetime variable à la même valeur que datetime variable. Cela entraîne la conversion de la valeur en smalldatetime et nous pouvons alors utiliser un SELECT
pour voir la valeur réelle qui a été affectée à chaque variable.
Dans ce cas, les deux variables arrondissent la valeur. Mais ils sont arrondis différemment.
La dateheure variable arrondit la fraction de seconde. C'est parce que datetime arrondit toujours par incréments de .000, .003 ou .007 secondes.
Le petitedateheure variable d'autre part, arrondit les minutes partie. De plus, la partie des secondes est mise à zéro. Il faut s'y attendre, car la documentation officielle de Microsoft indique que smalldatetime
l'heure est …basée sur une journée de 24 heures, avec des secondes toujours à zéro (:00) et sans fraction de seconde
.
Nous pouvons donc voir que le datetime type fournit une valeur de date/heure plus précise et exacte.
Exemple 2 - Définition de valeurs à partir de littéraux de chaîne
Dans les exemples précédents, le smalldateime la valeur a été attribuée en la définissant sur la même valeur que la datetime valeur. Lorsque nous faisons cela, SQL Server effectue une conversion implicite afin que les données « correspondent » au nouveau type de données.
Il s'avère que nous pouvons également définir le smalldatetime variable au même littéral de chaîne qui inclut des fractions de secondes (même si ce type de données ne stocke pas de fractions de secondes).
Voici un exemple où je fais exactement cela :
DECLARE @thedatetime datetime, @thesmalldatetime smalldatetime; SET @thedatetime = '2025-05-21 10:15:30.555'; SET @thesmalldatetime = '2025-05-21 10:15:30.555'; SELECT @thedatetime AS 'datetime', @thesmalldatetime AS 'smalldatetime';
Résultat :
+-------------------------+---------------------+ | datetime | smalldatetime | |-------------------------+---------------------| | 2025-05-21 10:15:30.557 | 2025-05-21 10:16:00 | +-------------------------+---------------------+
Bien sûr, le résultat est le même lorsque nous sélectionnons les valeurs - le smalldatetime la valeur n'affiche aucune fraction de seconde, les secondes sont égales à zéro et les minutes sont arrondies.
Cependant, si nous utilisons plus de 3 décimales, les deux types de données renverront une erreur.
Erreur pour datetime :
DECLARE @thedatetime datetime, @thesmalldatetime smalldatetime; SET @thedatetime = '2025-05-21 10:15:30.5555'; SET @thesmalldatetime = '2025-05-21 10:15:30.5555'; SELECT @thedatetime AS 'datetime', @thesmalldatetime AS 'smalldatetime';
Résultat :
Msg 241, Level 16, State 1, Line 4 Conversion failed when converting date and/or time from character string.
Erreur pour smalldatetime :
DECLARE @thedatetime datetime, @thesmalldatetime smalldatetime; SET @thedatetime = '2025-05-21 10:15:30.5555'; SET @thesmalldatetime = '2025-05-21 10:15:30.5555'; SELECT @thedatetime AS 'datetime', @thesmalldatetime AS 'smalldatetime';
Résultat :
Msg 295, Level 16, State 3, Line 5 Conversion failed when converting character string to smalldatetime data type.
Exemple 3 – Taille de stockage
Le petitedateheure Le type de données a une taille de stockage fixe de 4 octets. C'est l'un des rares avantages smalldatetime a plus de datetime , qui a une taille de stockage fixe de 8 octets.
Nous pouvons vérifier la taille de stockage en utilisant le DATALENGTH()
fonction pour retourner le nombre d'octets utilisés pour chacune de nos valeurs :
DECLARE @thedatetime datetime, @thesmalldatetime smalldatetime; SET @thedatetime = '2025-05-21 10:15:30.123'; SET @thesmalldatetime = @thedatetime; SELECT DATALENGTH(@thedatetime) AS 'datetime', DATALENGTH(@thesmalldatetime) AS 'smalldatetime';
Résultat
+------------+-----------------+ | datetime | smalldatetime | |------------+-----------------| | 8 | 4 | +------------+-----------------+
Nous obtenons également le même résultat même si nous les convertissons en varbinary , qui est plus représentatif de la manière dont ils sont réellement stockés dans la base de données :
DECLARE @thedatetime datetime, @thesmalldatetime smalldatetime; SET @thedatetime = '2025-05-21 10:15:30.123'; SET @thesmalldatetime = @thedatetime; SELECT DATALENGTH(CAST(@thedatetime AS varbinary(10))) AS 'datetime', DATALENGTH(CAST(@thesmalldatetime AS varbinary(10))) AS 'smalldatetime';
Résultat
+------------+-----------------+ | datetime | smalldatetime | |------------+-----------------| | 8 | 4 | +------------+-----------------+