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

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

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

L'un des avantages de la conversion d'un datetime valeur au temps est que vous réduisez la taille de stockage de 8 octets à 3, 4 ou 5 octets (selon la précision que vous utilisez pour le temps valeur). À proprement parler, le temps utilise 4, 5 ou 6 octets, car un octet supplémentaire est utilisé pour stocker sa précision.

Lorsque vous convertissez un datetime valeur au temps , seule la partie heure de la valeur est copiée. Le résultat exact dépendra de la précision en fractions de seconde que vous attribuez à l'heure . Quand le temps la précision est inférieure à la datetime précision, les fractions de seconde sont arrondies pour correspondre à l'heure précision.

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 temps Le type de données, d'autre part, vous permet de spécifier une précision fractionnaire de secondes de 0 à 7. Ceci est réalisé en utilisant le time(n ) syntaxe, où n est l'échelle de 0 à 7. Si vous ne le spécifiez pas, il utilisera 7, qui fournit une précision de 100 nanosecondes.

Exemple 1 – Conversion implicite

Voici un exemple de conversion implicite entre datetime et temps .

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

Résultat :

+-------------------------+------------------+
| datetime                | time             |
|-------------------------+------------------|
| 2025-05-21 10:15:30.123 | 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 temps variables.

La chose la plus évidente à propos de ce résultat est que le temps la valeur n'inclut pas la date. Il faut s'y attendre, car le temps Le type de données sert uniquement à stocker des valeurs de temps, pas des valeurs de date.

Nous pouvons également voir que le temps 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). Cela se produit parce que le temps value utilise l'échelle par défaut de 7 (car nous n'avons pas explicitement spécifié d'échelle).

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.

Voici un exemple :

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

Résultat :

+-------------------------+------------------+
| datetime                | thetime          |
|-------------------------+------------------|
| 2025-05-21 10:15:30.127 | 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 temps valeur cependant, définissez les secondes fractionnaires sur 1266667 .

Si nous définissons simplement la valeur initiale sur time en premier lieu, sa partie fractionnaire aurait renvoyé 1250000 .

Exemple 3 – Précision/Exactitude

Comme mentionné, le temps Le type de données vous permet de spécifier la précision en fractions de secondes. Si vous ne le faites pas, il utilise 7 (par conséquent, l'exemple précédent utilise 7).

Vous pouvez modifier cela en utilisant le time(n ) syntaxe. Par conséquent, j'aurais pu utiliser time(7) pour que les exemples précédents obtiennent le même résultat.

Dans cet exemple, je supprime complètement les fractions de seconde en utilisant time(0) :

DECLARE 
  @thedatetime datetime, 
  @thetime time(0);
SET @thedatetime = '2025-05-21 10:15:30.125';
SET @thetime = @thedatetime;
SELECT 
  @thedatetime AS 'datetime',
  @thetime AS 'time';

Résultat :

+-------------------------+----------+
| datetime                | time     |
|-------------------------+----------|
| 2025-05-21 10:15:30.127 | 10:15:30 |
+-------------------------+----------+

Lorsque nous faisons cela, la taille de stockage de l'heure la valeur est réduite à 3 octets (4 octets incluant la précision) contre 8 octets pour la datetime valeur.

Sachez que l'utilisation d'une précision inférieure à la valeur d'origine entraînera l'arrondi du résultat pour correspondre à la précision spécifiée.

Exemple :

DECLARE 
  @thedatetime datetime, 
  @thetime time(0);
SET @thedatetime = '2025-05-21 10:15:30.525';
SET @thetime = @thedatetime;
SELECT 
  @thedatetime AS 'datetime',
  @thetime AS 'time';

Résultat :

+-------------------------+----------+
| datetime                | time     |
|-------------------------+----------|
| 2025-05-21 10:15:30.527 | 10:15:31 |
+-------------------------+----------+

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

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

Résultat :

+-------------------------+-----------+
| datetime                | time(0)   |
|-------------------------+-----------|
| 2025-05-21 10:15:30.127 | 10:15:30  |
+-------------------------+-----------+

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(time(0), @thedatetime) AS 'time(0)';

Résultat :

+-------------------------+-----------+
| datetime                | time(0)   |
|-------------------------+-----------|
| 2025-05-21 10:15:30.127 | 10:15:30  |
+-------------------------+-----------+