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

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

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

L'un des avantages de la conversion d'un datetime2 valeur au temps est que vous réduisez la taille de stockage entre 6 et 8 octets, jusqu'à entre 3 et 5 octets (selon la précision que chaque type de données lui a attribuée). À proprement parler, 1 octet supplémentaire est utilisé pour stocker la précision de ces types de données, vous devez donc ajouter 1 octet à ces quantités.

Évidemment, vous perdez la partie date lors de la conversion, mais vous ne feriez pas cette conversion si vous deviez conserver la partie date.

Lorsque vous convertissez un datetime2 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 attribuée à chaque type. Quand le temps la précision est inférieure à datetime2 précision, les fractions de seconde sont arrondies pour correspondre à l'heure précision.

En ce qui concerne la précision, les deux types de données vous permettent de spécifier une échelle de 0 à 7 décimales. Par conséquent, vous avez la possibilité d'effectuer la conversion sans perdre de fraction de seconde ni avoir le résultat arrondi.

Exemple 1 – Conversion implicite

Voici un exemple de conversion implicite entre datetime2 et temps .

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

Résultat :

+-------------------------------------------+---------------- --+| dateheure2 | temps ||-----------------------------+----------------- -|| 2025-05-21 10:15:30.1234567 | 10:15:30.1234567 |+----------------------------+---------------------- -----+

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

De plus, dans cet exemple, les deux types de données utilisent leur précision par défaut (qui est une échelle de 7). Cela signifie que le temps la valeur se termine avec la même précision que le datetime2 valeur. La raison pour laquelle je sais qu'ils utilisent leur précision par défaut est que je n'ai pas spécifié d'échelle de fraction de seconde lors de leur déclaration.

Exemple 2 - Convertir en une précision supérieure

Dans cet exemple, le temps variable utilise une plus grande précision à la datetime2 variable.

DECLARE @thedatetime2 datetime2(4), @thetime time(7);SET @thedatetime2 ='2025-05-21 10:15:30.1234567';SET @thetime =@thedatetime2;SELECT @thedatetime2 AS 'datetime2', @thetime AS 'time';

Résultat :

+--------------------------+------------------+ | dateheure2 | temps ||---------------------+------------------------------|| 2025-05-21 10:15:30.1235 | 10:15:30.1235000 |+-----------------------------------+---------------- --+

Dans ce cas, le datetime2 la variable utilise une échelle de 4, et le temps la variable utilise 7.

Cela se traduit par datetime2 en arrondissant les fractions de seconde, nous obtenons donc 1235 au lieu de 1234 . Cela signifie également que lorsque nous le convertissons en heure , la valeur se termine par 3 zéros à la fin (car nous avons spécifié une échelle de 7). Cela signifie également que le temps la taille de stockage de la valeur est de 5 octets (6 avec la précision) contre 4 octets (5 avec la précision) si nous lui avions donné une échelle de 4.

Exemple 3 – Convertir en une précision inférieure

Dans cet exemple, le temps la variable utilise une précision inférieure à la datetime2 variable.

DECLARE @thedatetime2 datetime2(7), @thetime time(0);SET @thedatetime2 ='2025-05-21 10:15:30.5678912';SET @thetime =@thedatetime2;SELECT @thedatetime2 AS 'datetime2', @thetime AS 'time';

Résultat :

+-----------------------------+----------+| dateheure2 | temps ||----------------------------+----------|| 2025-05-21 10:15:30.5678912 | 10:15:31 |+----------------------------+----------+ 

Donc dans ce cas temps L'échelle de est réduite à 0, ce qui signifie qu'aucune fraction de seconde n'est incluse dans le résultat. De plus, les secondes sont arrondies en conséquence.

Le temps la valeur utilise 4 octets de stockage (y compris la précision), contre 9 octets pour le datetime2 valeur (et comparée à 6 octets pour le temps valeur dans l'exemple précédent).

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

DECLARE @thedatetime2 datetime2(3);SET @thedatetime2 ='2025-05-21 10:15:30.123';SELECT @thedatetime2 AS 'datetime2', CAST(@thedatetime2 AS time(0)) AS 'time( 0)';

Résultat :

+-------------------------+-----------+| dateheure2 | temps(0) ||-------------------------+-----------|| 2025-05-21 10:15:30.123 | 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 @thedatetime2 datetime2(3);SET @thedatetime2 ='2025-05-21 10:15:30.123';SELECT @thedatetime2 AS 'datetime2', CONVERT(time(0), @thedatetime2) AS 'time( 0)';

Résultat :

+-------------------------+-----------+| dateheure2 | temps(0) ||-------------------------+-----------|| 2025-05-21 10:15:30.123 | 10:15:30 |+-------------------------+-----------+