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

datetime vs smalldatetime dans SQL Server :quelle est la différence ?

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               |
+------------+-----------------+