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

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

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

Lorsque vous convertissez un datetime valeur à datetime2 , la valeur résultante dépendra de la précision en fractions de seconde que vous attribuez à datetime2 .

La dateheure Le type de données 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.

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).

Exemple 1 – Conversion implicite

Voici un exemple de conversion implicite entre datetime et datetime2 .

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

Résultat :

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

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

Nous pouvons voir que le datetime2 la variable a plus de précision en fractions de secondes, et nous nous retrouvons avec une partie fractionnaire de 1233333 (contre 123 pour le datetime valeur).

Exemple 2 – 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. Comme vous vous en doutez, cela peut causer beaucoup de confusion si vous ne savez pas comment cela fonctionne. Non seulement cela peut prêter à confusion lors de l'utilisation de datetime en soi, cela peut entraîner une confusion supplémentaire lors de la conversion de cette valeur en un autre type de données.

Voici un exemple qui illustre ce que je veux dire.

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

Résultat :

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

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

Le datetime2 valeur cependant, définissez les secondes fractionnaires sur 1266667 .

Au fait, si nous définissons simplement la valeur initiale sur datetime2 en premier lieu, sa partie fractionnaire aurait renvoyé 1250000 .

Exemple 3 – Précision/Exactitude

L'un des avantages de datetime2 est qu'il vous permet de spécifier la précision des fractions de secondes. Si vous ne le faites pas, il utilise 7 (par conséquent, l'exemple précédent utilise 7).

On peut donc modifier l'exemple précédent pour que la datetime2 la valeur utilise la même précision en fractions de seconde que la datetime type de données.

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

Résultat :

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

Lorsque nous faisons cela, le datetime2 value renvoie le même résultat que datetime valeur. Il utilise également la même quantité de stockage (8 octets). Dans ce cas, datetime2 utilise 7 octets pour stocker la valeur et 1 octet pour stocker la précision de la valeur.

Vous pouvez même spécifier moins précision fractionnaire de seconde que datetime si vous n'avez pas besoin de la précision supplémentaire. Cela vous fera économiser un octet entier sur l'espace de stockage (votre datetime2 la valeur utilisera 7 octets, contre 8 octets pour la datetime valeur).

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

Résultat :

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

Gardez à l'esprit que cela peut également entraîner l'arrondi des fractions de secondes.

Exemple 4 - 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 datetime et datetime2 .

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

Résultat :

+-------------------------+-------------------------+
| datetime                | datetime2(3)            |
|-------------------------+-------------------------|
| 2025-05-21 10:15:30.127 | 2025-05-21 10:15:30.127 |
+-------------------------+-------------------------+

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

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

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

Résultat :

+-------------------------+-------------------------+
| datetime                | datetime2(3)            |
|-------------------------+-------------------------|
| 2025-05-21 10:15:30.127 | 2025-05-21 10:15:30.127 |
+-------------------------+-------------------------+

Recommandation de Microsoft

Microsoft recommande d'utiliser la conversion explicite chaque fois qu'il existe un scénario de comparaison mixte entre ces deux types de données :

Sous le niveau de compatibilité de la base de données 130, les conversions implicites de datetime à datetime2 les types de données affichent une précision améliorée en tenant compte des fractions de millisecondes, ce qui entraîne différentes valeurs converties… Utilisez une conversion explicite en datetime2 type de données chaque fois qu'un scénario de comparaison mixte entre datetime et datetime2 types de données existent.