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

Convierta 'fecha y hora' en 'hora' en SQL Server (ejemplos de T-SQL)

Este artículo contiene ejemplos de cómo convertir una fecha y hora valor a un tiempo valor en SQL Server.

Uno de los beneficios de convertir un datetime valor a tiempo es que reduce el tamaño de almacenamiento de 8 bytes a 3, 4 o 5 bytes (dependiendo de la precisión que use para el tiempo valor). Estrictamente hablando, tiempo usa 4, 5 o 6 bytes, porque se usa un byte adicional para almacenar su precisión.

Cuando convierte una fecha y hora 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 le asigne al tiempo. . Cuando el tiempo la precisión es menor que la fecha y hora precisión, las fracciones de segundo se redondean hacia arriba para que coincidan con el tiempo precisión.

La fechahora tipo de datos tiene un máximo de 3 dígitos para su parte de segundos fraccionarios. Su precisión se redondea a incrementos de 0,000, 0,003 o 0,007 segundos.

El tiempo El tipo de datos, por otro lado, le permite especificar una precisión de segundos fraccionarios de 0 a 7. Esto se logra mediante el uso de time(n ) sintaxis, donde n es la escala de 0 a 7. Si no especifica esto, utilizará 7, lo que proporciona una precisión de 100 nanosegundos.

Ejemplo 1:conversión implícita

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

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

Resultado:

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

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 la fecha y hora valor a un tiempo variables.

Lo más obvio 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.

También podemos ver que el tiempo variable tiene más precisión de segundos fraccionarios, y terminamos con una parte fraccionaria de 1233333 (frente a 123 para la fechahora valor). Esto sucede porque el tiempo value está usando la escala predeterminada de 7 (porque no especificamos explícitamente una escala).

Ejemplo 2:redondeo

La fechahora el tipo de datos se redondea a incrementos de .000, .003 o .007 segundos. Incluso si lo establece explícitamente en otro valor, se redondeará.

He aquí un ejemplo:

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

Resultado:

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

En este ejemplo, configuré los segundos fraccionarios en 125 pero fechahora redondeado a 127 (porque solo se puede redondear a incrementos de 0,000, 0,003 o 0,007 segundos).

El tiempo sin embargo, establezca los segundos fraccionarios en 1266667 .

Si simplemente estableciéramos el valor inicial en tiempo en primer lugar, su parte fraccionaria habría devuelto 1250000 .

Ejemplo 3:Precisión/Exactitud

Como se mencionó, el tiempo tipo de datos le permite especificar la precisión de segundos fraccionarios. Si no hace esto, usa 7 (por lo tanto, el ejemplo anterior usa 7).

Puede modificar esto usando el time(n ) sintaxis. Por lo tanto, podría haber usado time(7) para que los ejemplos anteriores obtengan el mismo resultado.

En este ejemplo, elimino las fracciones de segundo usando 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';

Resultado:

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

Cuando hacemos esto, el tamaño de almacenamiento del tiempo el valor se reduce a 3 bytes (4 bytes incluida la precisión) en lugar de 8 bytes para la fecha y hora valor.

Tenga en cuenta que el uso de una precisión más baja que el valor original hará que el resultado se redondee para ajustarse a la precisión especificada.

Ejemplo:

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

Resultado:

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

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 datetime y tiempo .

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

Resultado:

+-------------------------+-----------+
| datetime                | time(0)   |
|-------------------------+-----------|
| 2025-05-21 10:15:30.127 | 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 @thedatetime datetime;
SET @thedatetime = '2025-05-21 10:15:30.125';
SELECT 
  @thedatetime AS 'datetime',
  CONVERT(time(0), @thedatetime) AS 'time(0)';

Resultado:

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