sql >> Base de Datos >  >> RDS >> Sqlserver

Convierta 'datetime2' a 'time' en SQL Server (ejemplos de T-SQL)

Este artículo contiene ejemplos de cómo convertir un datetime2 valor a un tiempo valor en SQL Server.

Uno de los beneficios de convertir un datetime2 valor a tiempo es que reduzcas el tamaño de almacenamiento de entre 6 y 8 bytes, a entre 3 y 5 bytes (dependiendo de la precisión que le haya asignado cada tipo de dato). Estrictamente hablando, se usa 1 byte adicional para almacenar la precisión de estos tipos de datos, por lo que debe agregar 1 byte a estas cantidades.

Obviamente, pierde la parte de la fecha durante la conversión, pero no estaría haciendo esta conversión si necesitara conservar la parte de la fecha.

Cuando conviertes un datetime2 valor a tiempo , solo se copia la parte de tiempo del valor. El resultado exacto dependerá de la precisión de fracciones de segundo que se le asigne a cada tipo. Cuando el tiempo la precisión es menor que datetime2 precisión, las fracciones de segundo se redondean hacia arriba para que coincidan con el tiempo precisión.

Con respecto a la precisión, ambos tipos de datos le permiten especificar una escala desde 0 lugares decimales hasta 7. Por lo tanto, tiene la capacidad de realizar la conversión sin perder ninguna fracción de segundo o tener el resultado redondeado.

Ejemplo 1:conversión implícita

Este es un ejemplo de una conversión implícita entre datetime2 y tiempo .

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

Resultado:

+-----------------------------+------------------+
| datetime2                   | time             |
|-----------------------------+------------------|
| 2025-05-21 10:15:30.1234567 | 10:15:30.1234567 |
+-----------------------------+------------------+

Esta es una conversión implícita porque no estamos usando una función de conversión (como las que se muestran a continuación) para convertirla explícitamente. En este caso, SQL Server realiza una conversión implícita entre bastidores cuando intentamos asignar el datetime2 valor a un tiempo variables.

Lo más evidente de este resultado es que el tiempo el valor no incluye la fecha. Esto es de esperar, porque el tiempo El tipo de datos es únicamente para almacenar valores de tiempo, no valores de fecha.

Además, en este ejemplo, ambos tipos de datos usan su precisión predeterminada (que es una escala de 7). Esto significa que el tiempo el valor termina con la misma precisión que el datetime2 valor. La razón por la que sé que usan su precisión predeterminada es porque no especifiqué una escala de fracciones de segundo al declararlos.

Ejemplo 2:convertir a una mayor precisión

En este ejemplo, el tiempo variable utiliza mayor precisión que 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';

Resultado:

+--------------------------+------------------+
| datetime2                | time             |
|--------------------------+------------------|
| 2025-05-21 10:15:30.1235 | 10:15:30.1235000 |
+--------------------------+------------------+

En este caso, el datetime2 variable utiliza una escala de 4, y el tiempo usos variables 7.

Esto da como resultado datetime2 redondeando las fracciones de segundo, obtenemos 1235 en lugar de 1234 . También significa que cuando lo convertimos a tiempo , el valor termina con 3 ceros finales (porque especificamos una escala de 7). Esto también significa que el tiempo el tamaño de almacenamiento del valor es de 5 bytes (6 incluida la precisión) en comparación con los 4 bytes (5 incluida la precisión) si le hubiésemos dado una escala de 4.

Ejemplo 3:convertir a una precisión más baja

En este ejemplo, el tiempo la variable usa una precisión menor a 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';

Resultado:

+-----------------------------+----------+
| datetime2                   | time     |
|-----------------------------+----------|
| 2025-05-21 10:15:30.5678912 | 10:15:31 |
+-----------------------------+----------+

Entonces, en este caso, tiempo La escala de se reduce a 0, lo que significa que no se incluyen fracciones de segundo en el resultado. Además, los segundos se redondean en consecuencia.

El tiempo el valor usa 4 bytes de almacenamiento (incluida la precisión), en comparación con los 9 bytes para datetime2 valor (y comparado con 6 bytes para el tiempo valor en el ejemplo anterior).

Ejemplo 4:conversión explícita mediante CAST()

Este es un ejemplo de una conversión explícita. En este caso, uso el CAST() función directamente dentro del SELECT declaración para convertir explícitamente entre datetime2 y tiempo .

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)';

Resultado:

+-------------------------+-----------+
| datetime2               | time(0)   |
|-------------------------+-----------|
| 2025-05-21 10:15:30.123 | 10:15:30  |
+-------------------------+-----------+

Ejemplo 5:conversión explícita mediante CONVERT()

Aquí hay un ejemplo de una conversión explícita usando CONVERT() función en lugar 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)';

Resultado:

+-------------------------+-----------+
| datetime2               | time(0)   |
|-------------------------+-----------|
| 2025-05-21 10:15:30.123 | 10:15:30  |
+-------------------------+-----------+