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

Convertir 'smalldatetime' en 'datetime2' dans SQL Server (exemples T-SQL)

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

Le petitedateheure Le type de données n'a pas de fraction de seconde et son composant secondes est toujours défini sur zéro (:00). Sa précision est à la minute près.

Le datetime2 Le type de données, d'autre part, 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.

Lorsque vous convertissez un smalldatetime valeur à datetime2 , les heures et les minutes sont copiées. Les secondes et les fractions de secondes sont définies sur 0.

Exemple 1 – Conversion implicite

Voici un exemple de conversion implicite entre smalldatetime et datetime2 .

DECLARE 
  @thesmalldatetime smalldatetime,
  @thedatetime2 datetime2;
SET @thesmalldatetime = '2025-05-21 10:15:30';
SET @thedatetime2 = @thesmalldatetime;
SELECT 
  @thesmalldatetime AS 'smalldatetime',
  @thedatetime2 AS 'datetime2';

Résultat :

+---------------------+-----------------------------+
| smalldatetime       | datetime2                   |
|---------------------+-----------------------------|
| 2025-05-21 10:16:00 | 2025-05-21 10:16:00.0000000 |
+---------------------+-----------------------------+

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 smalldatetime valeur à un datetime2 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. Il en résulte que 7 zéros sont utilisés dans la partie fractionnaire.

Exemple 2 - Supprimer la partie fractionnaire

Vous pouvez supprimer les fractions de secondes si nécessaire. Pour ce faire, utilisez simplement datetime2(0) lors de la déclaration de la variable.

DECLARE 
  @thesmalldatetime smalldatetime,
  @thedatetime2 datetime2(0);
SET @thesmalldatetime = '2025-05-21 10:15:30';
SET @thedatetime2 = @thesmalldatetime;
SELECT 
  @thesmalldatetime AS 'smalldatetime',
  @thedatetime2 AS 'datetime2';

Résultat :

+---------------------+---------------------+
| smalldatetime       | datetime2           |
|---------------------+---------------------|
| 2025-05-21 10:16:00 | 2025-05-21 10:16:00 |
+---------------------+---------------------+

Donc, dans ce cas, les deux types de données renvoient la même valeur. Cependant, la différence est que le datetime2 a la capacité de fournir une précision à la seconde (par rapport à smalldatetime précision à la minute près).

Exemple :

DECLARE 
  @thesmalldatetime smalldatetime,
  @thedatetime2 datetime2(0);
SET @thesmalldatetime = '2025-05-21 10:15:30';
SET @thedatetime2 = @thesmalldatetime;
SELECT 
  DATEADD(second, 30, @thesmalldatetime) AS 'smalldatetime',
  DATEADD(second, 30, @thedatetime2) AS 'datetime2';

Résultat :

+---------------------+---------------------+
| smalldatetime       | datetime2           |
|---------------------+---------------------|
| 2025-05-21 10:17:00 | 2025-05-21 10:16:30 |
+---------------------+---------------------+

Dans cet exemple, j'ai utilisé le DATEADD() fonction pour ajouter 30 secondes à chaque valeur. Cependant, chaque type de données renvoie un résultat différent. Le datetime2 Le type de données respecte la partie des secondes et fournit le résultat correct avec une précision de 100 %. Le petitedateheure type, est arrondi à la minute la plus proche (tandis que la partie des secondes reste à zéro).

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 smalldatetime et datetime2 .

DECLARE @thesmalldatetime smalldatetime;
SET @thesmalldatetime = '2025-05-21 10:15:30';
SELECT 
  @thesmalldatetime AS 'thesmalldatetime',
  CAST(@thesmalldatetime AS datetime2(0)) AS 'datetime2(0)';

Résultat :

+---------------------+---------------------+
| thesmalldatetime    | datetime2(0)        |
|---------------------+---------------------|
| 2025-05-21 10:16:00 | 2025-05-21 10:16:00 |
+---------------------+---------------------+

Exemple 4 - Conversion explicite à l'aide de CONVERT()

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

DECLARE @thesmalldatetime smalldatetime;
SET @thesmalldatetime = '2025-05-21 10:15:30';
SELECT 
  @thesmalldatetime AS 'thesmalldatetime',
  CONVERT(datetime2(0), @thesmalldatetime) AS 'datetime2(0)';

Résultat :

+---------------------+---------------------+
| thesmalldatetime    | datetime2(0)        |
|---------------------+---------------------|
| 2025-05-21 10:16:00 | 2025-05-21 10:16:00 |
+---------------------+---------------------+