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

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

Il y a probablement très peu de cas d'utilisation qui vous amèneraient à convertir un datetime2 valeur à datetime dans SQL Server. En particulier, le datetime2 le type de données peut être défini pour utiliser la même taille de stockage que datetime , mais avec une plus grande précision. Donc, dans la plupart des cas, vous feriez mieux d'utiliser datetime2 qu'avec un datetime . Microsoft recommande également d'utiliser datetime2 au lieu de datetime .

Toutefois, si vous vous trouvez dans une situation où vous devez effectuer cette conversion, cet article contient des exemples et des considérations qui peuvent vous être utiles.

Lorsque vous convertissez un datetime2 valeur à datetime , la valeur résultante dépendra des fractions de seconde qui ont été attribuées à la datetime2 valeur, ainsi que sa précision.

Le datetime2 Le type de données 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).

La dateheure Le type de données, d'autre part, a un maximum de 3 chiffres pour sa fraction de seconde. Sa précision est arrondie à des incréments de .000, .003 ou .007 secondes.

Par conséquent, si le datetime2 utilise une échelle de 3, la valeur résultante sera très proche (sinon identique) de la valeur d'origine. Cependant, en raison de la moindre précision de datetime , les résultats peuvent être différents, en raison de l'arrondi qu'il effectue.

Exemple 1 – Conversion implicite

Voici un exemple de conversion implicite entre datetime2 et dateheure .

DECLARE 
  @thedatetime2 datetime2, 
  @thedatetime datetime;
SET @thedatetime2 = '2025-05-21 10:15:30.1234567';
SET @thedatetime = @thedatetime2;
SELECT 
  @thedatetime2 AS 'datetime2',
  @thedatetime AS 'datetime';

Résultat :

+-----------------------------+-------------------------+
| datetime2                   | datetime                |
|-----------------------------+-------------------------|
| 2025-05-21 10:15:30.1234567 | 2025-05-21 10:15:30.123 |
+-----------------------------+-------------------------+

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 datetime2 valeur à un datetime variables.

Nous pouvons voir que le datetime la variable a une précision inférieure à la fraction de seconde, et nous nous retrouvons avec une partie fractionnaire de 123 même si la partie fractionnaire d'origine était 1234567 .

Dans ce cas, aucun arrondi n'a été effectué.

Exemple 2 - Précision/exactitude et arrondi

La dateheure Le type de données est arrondi à des incréments de 0,000, 0,003 ou 0,007 seconde. Même si vous le définissez explicitement sur une autre valeur, il sera arrondi.

Cela s'applique également lors de la conversion à partir d'un autre type de données (comme ce que nous faisons ici).

Voici un exemple qui illustre ce que je veux dire.

DECLARE 
  @thedatetime2 datetime2, 
  @thedatetime datetime;
SET @thedatetime2 = '2025-05-21 10:15:30.1256789';
SET @thedatetime = @thedatetime2;
SELECT 
  @thedatetime2 AS 'datetime2',
  @thedatetime AS 'datetime';

Résultat :

+-----------------------------+-------------------------+
| datetime2                   | datetime                |
|-----------------------------+-------------------------|
| 2025-05-21 10:15:30.1256789 | 2025-05-21 10:15:30.127 |
+-----------------------------+-------------------------+

Dans cet exemple, j'ai défini les fractions de seconde de la datetime2 valeur à 1256789 mais datetime arrondi à 127 (car il ne peut être arrondi qu'à des incréments de .000, .003 ou .007 secondes).

Il est important de noter que cela sera toujours vrai, même si nous n'attribuons que 3 fractions de seconde à la datetime2 valeur.

Exemple :

DECLARE 
  @thedatetime2 datetime2(3), 
  @thedatetime datetime;
SET @thedatetime2 = '2025-05-21 10:15:30.125';
SET @thedatetime = @thedatetime2;
SELECT 
  @thedatetime2 AS 'datetime2',
  @thedatetime AS 'datetime';

Résultat :

+-------------------------+-------------------------+
| datetime2               | datetime                |
|-------------------------+-------------------------|
| 2025-05-21 10:15:30.125 | 2025-05-21 10:15:30.127 |
+-------------------------+-------------------------+

Il est également utile d'être conscient de tout arrondi qui pourrait se produire à la datetime2 d'origine valeur. Le datetime2 la valeur pourrait elle-même être arrondie si nous essayons d'attribuer une valeur avec plus de secondes fractionnaires que sa propre échelle.

Exemple :

DECLARE 
  @thedatetime2 datetime2(3), 
  @thedatetime datetime;
SET @thedatetime2 = '2025-05-21 10:15:30.1256789';
SET @thedatetime = @thedatetime2;
SELECT 
  @thedatetime2 AS 'datetime2',
  @thedatetime AS 'datetime';

Résultat :

+-------------------------+-------------------------+
| datetime2               | datetime                |
|-------------------------+-------------------------|
| 2025-05-21 10:15:30.126 | 2025-05-21 10:15:30.127 |
+-------------------------+-------------------------+

Dans ce cas, j'essaie d'attribuer une valeur avec une partie fractionnaire de 1256789 . Cependant, parce que le datetime2(3) la valeur n'a qu'une échelle de 3, elle ne peut prendre en charge que 3 décimales, et dans ce cas, le dernier chiffre est arrondi (car le chiffre suivant est 5 ou plus).

Les deux datetime2(3) et dateheure utiliser la même quantité d'espace de stockage (8 octets). Le datetime2(3) Le type de données utilise en fait 7 octets pour stocker les données, mais 1 octet supplémentaire pour stocker la précision.

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

DECLARE @thedatetime2 datetime2;
SET @thedatetime2 = '2025-05-21 10:15:30.1234567';
SELECT 
  @thedatetime2 AS 'datetime2',
  CAST(@thedatetime2 AS datetime) AS 'datetime';

Résultat :

+-----------------------------+-------------------------+
| datetime2                   | datetime                |
|-----------------------------+-------------------------|
| 2025-05-21 10:15:30.1234567 | 2025-05-21 10:15:30.123 |
+-----------------------------+-------------------------+

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

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

DECLARE @thedatetime2 datetime2;
SET @thedatetime2 = '2025-05-21 10:15:30.1234567';
SELECT 
  @thedatetime2 AS 'datetime2',
  CONVERT(datetime, @thedatetime2) AS 'datetime';

Résultat :

+-----------------------------+-------------------------+
| datetime2                   | datetime                |
|-----------------------------+-------------------------|
| 2025-05-21 10:15:30.1234567 | 2025-05-21 10:15:30.123 |
+-----------------------------+-------------------------+