Database.Guide

Cet article contient des exemples de conversion d’une valeur de date en valeur smalldatetime dans SQL Server.

Lorsque vous convertissez une valeur de date en smalldatetime, des informations supplémentaires sont ajoutées à la valeur. Cela est dû au fait que le type de données smalldatetime contient à la fois des informations sur la date et l’heure. Le type de données date, quant à lui, ne contient que des informations sur la date.

Cependant, il existe des cas où une conversion de date en smalldatetime peut échouer. En particulier, si la valeur de la date est en dehors de la plage supportée par smalldatetime, alors elle échouera avec une erreur.

Dans tous les cas, voici des exemples de conversion entre ces deux types de données.

Exemple 1 – Conversion implicite

Voici un exemple de conversion implicite entre date et smalldatetime.

DECLARE @thedate date, @thesmalldatetime smalldatetimeSET @thedate = '2020-12-01'SET @thesmalldatetime = @thedateSELECT @thedate AS 'date', @thesmalldatetime AS 'smalldatetime';

Résultat:

+------------+---------------------+| date | smalldatetime ||------------+---------------------|| 2020-12-01 | 2020-12-01 00:00: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 en coulisse lorsque nous essayons d’affecter la valeur de la date à une variable smalldatetime.

Nous pouvons voir que la variable date ne contient que des informations de date, alors que, la variable smalldatetime contient à la fois des informations de date et d’heure.

Lorsque vous convertissez entre la date et la variable smalldatetime, la composante temps est fixée à 00:00:00. Cela permet d’obtenir une précision à la minute près.

La raison pour laquelle il y a tous les zéros est que la valeur de la date ne contient aucune information sur l’heure, donc il n’y a aucun moyen pour SQL Server de savoir quelle heure vous voulez (s’il y en a une).

Bien sûr, vous obtenez également ce résultat même si vous affectez simplement une valeur de date seule à un smalldatetime sans effectuer de conversion:

DECLARE @thesmalldatetime smalldatetime = '2020-12-01'SELECT @thesmalldatetime AS 'smalldatetime';

Résultat:

+---------------------+| smalldatetime ||---------------------|| 2020-12-01 00:00:00 |+---------------------+

Exemple 2 – Modifier l’heure

Si vous devez spécifier une heure (mais garder la même date), vous pouvez utiliser la fonction DATEADD() pour le faire.

DECLARE @thedate date, @thesmalldatetime smalldatetimeSET @thedate = '2020-12-01'SET @thesmalldatetime = @thedateSET @thesmalldatetime = DATEADD(hour, 7, @thesmalldatetime)SELECT @thedate AS 'date', @thesmalldatetime AS 'smalldatetime';

Résultat:

+------------+---------------------+| date | smalldatetime ||------------+---------------------|| 2020-12-01 | 2020-12-01 07:00:00 |+------------+---------------------+

Exemple 3 – Conversion explicite avec CAST()

Voici un exemple de conversion explicite. Dans ce cas, j’utilise la fonction CAST() directement dans l’instruction SELECT pour convertir explicitement entre date et smalldatetime.

DECLARE @thedate dateSET @thedate = '2020-12-01'SELECT @thedate AS 'date', CAST(@thedate AS smalldatetime) AS 'smalldatetime';

Résultat:

+------------+---------------------+| date | smalldatetime ||------------+---------------------|| 2020-12-01 | 2020-12-01 00:00:00 |+------------+---------------------+

Même résultat que la conversion implicite.

Nous pouvons également ajuster l’heure comme ceci:

DECLARE @thedate dateSET @thedate = '2020-12-01'SELECT @thedate AS 'date', DATEADD(hour, 7, CAST(@thedate AS smalldatetime)) AS 'smalldatetime';

Résultat:

+------------+---------------------+| date | smalldatetime ||------------+---------------------|| 2020-12-01 | 2020-12-01 07:00:00 |+------------+---------------------+

Exemple 4 – Conversion explicite utilisant CONVERT()

Voici un exemple de conversion explicite utilisant la fonction CONVERT() au lieu de CAST().

DECLARE @thedate dateSET @thedate = '2020-12-01'SELECT @thedate AS 'date', CONVERT(smalldatetime, @thedate) AS 'smalldatetime';

Résultat:

+------------+---------------------+| date | smalldatetime ||------------+---------------------|| 2020-12-01 | 2020-12-01 00:00:00 |+------------+---------------------+

Et ajustement de l’heure:

DECLARE @thedate dateSET @thedate = '2020-12-01'SELECT @thedate AS 'date', DATEADD(hour, 7, CONVERT(smalldatetime, @thedate)) AS 'smalldatetime';

Résultat:

+------------+---------------------+| date | smalldatetime ||------------+---------------------|| 2020-12-01 | 2020-12-01 07:00:00 |+------------+---------------------+

Exemple 5 – Erreur hors plage

Comme mentionné, si la date est en dehors de la plage supportée par le type de données smalldatetime, vous obtiendrez une erreur.

DECLARE @thedate dateSET @thedate = '2080-12-01'SELECT @thedate AS 'date', CAST(@thedate AS smalldatetime) AS 'smalldatetime';

Résultat:

The conversion of a date data type to a smalldatetime data type resulted in an out-of-range value.

Le type de données smalldatetime ne prend en charge que les plages de dates allant de 1900-01-01 à 2079-06-06.

De plus, le type de données smalldatetime ne prend en charge que les plages de temps 00:00:00 à 23:59:59, donc vous obtiendrez également une erreur si vous essayez d’utiliser une valeur en dehors de cette plage (par exemple, avec une précision plus élevée).

Exemple:

DECLARE @thedate dateSET @thedate = '2020-12-01'SELECT @thedate AS 'date', DATEADD(nanosecond, 7, CAST(@thedate AS smalldatetime)) AS 'smalldatetime';

Résultat:

The datepart nanosecond is not supported by date function dateadd for data type smalldatetime.

Toutefois, dans ce cas, ce n’est pas une erreur lors de la conversion, c’est en fait une erreur lors de l’utilisation de la fonction DATEADD() (parce que la fonction ne permet pas d’utiliser cette partie de date particulière sur un type de données smalldatetime).

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée.