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

Exemples de conversion de 'date' en 'smalldatetime' dans SQL Server (T-SQL)

Cet article contient des exemples de conversion d'une date valeur à un smalldatetime valeur dans SQL Server.

Lorsque vous convertissez une date valeur à smalldatetime , des informations supplémentaires sont ajoutées à la valeur. C'est parce que le smalldatetime Le type de données contient à la fois des informations de date et d'heure. La date Le type de données, en revanche, ne contient que des informations de date.

Cependant, il existe des cas où une date à smalldatetime la conversion peut échouer. En particulier, si la date la valeur est en dehors de la plage prise en charge par smalldatetime alors il é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 smalldatetime
SET @thedate = '2020-12-01'
SET @thesmalldatetime = @thedate
SELECT 
  @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 dans les coulisses lorsque nous essayons d'attribuer la date valeur à un smalldatetime variables.

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

Lorsque vous convertissez entre date et smalldatetime , le composant horaire est défini sur 00:00:00 . Cela permet d'avoir une précision à la minute près.

La raison pour laquelle il n'y a que des zéros est que la valeur de date ne contient aucune information de temps, donc il n'y a aucun moyen pour SQL Server de savoir quelle heure vous voulez (le cas échéant).

Bien sûr, vous obtenez également ce résultat même si vous attribuez simplement une valeur de date uniquement à 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 le DATEADD() fonction pour faire exactement cela.

DECLARE @thedate date, @thesmalldatetime smalldatetime
SET @thedate = '2020-12-01'
SET @thesmalldatetime = @thedate
SET @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 à 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 date et smalldatetime .

DECLARE @thedate date
SET @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 date
SET @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 à l'aide de CONVERT()

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

DECLARE @thedate date
SET @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 régler l'heure :

DECLARE @thedate date
SET @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 prise en charge par le smalldatetime type de données, vous obtiendrez une erreur.

DECLARE @thedate date
SET @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 petitedateheure Le type de données ne prend en charge que les plages de dates comprises entre 1900-01-01 et 2079-06-06.

En outre, le smalldatetime Le type de données ne prend en charge que les plages horaires comprises entre 00:00:00 et 23:59:59. Vous obtiendrez donc é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 date
SET @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.

Cependant, dans ce cas, ce n'est pas une erreur lors de la conversion, c'est en fait une erreur lors de l'utilisation de DATEADD() fonction (car la fonction n'autorise pas l'utilisation de cette partie de date particulière sur un smalldatetime type de données).