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

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

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

Cuando conviertes un smalldatetime valor a tiempo , pierdes la fecha. Se copian las horas, los minutos y los segundos. Los segundos fraccionarios se establecen en 0.

La pequeña fecha y hora el tipo de datos incluye tanto la fecha como la hora. Sin embargo, el tiempo no tiene fracciones de segundo y su componente de segundos siempre se establece en cero (:00). Su precisión es al minuto más cercano. Su tamaño de almacenamiento es de 4 bytes.

El tiempo tipo de datos por otro lado, sólo incluye la hora. Sin embargo, le permite especificar una precisión de fracciones de segundo 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 (el valor predeterminado), que proporciona una precisión de 100 nanosegundos. Si especifica cero (0 ), su precisión será al segundo más cercano. Su tamaño de almacenamiento será de 3, 4 o 5 bytes (más 1 byte para almacenar la precisión), según la precisión de las fracciones de segundo.

Ejemplo 1:conversión implícita

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

DECLARE 
  @thesmalldatetime smalldatetime, 
  @thetime time;
SET @thesmalldatetime = '2025-05-21 10:15:30';
SET @thetime = @thesmalldatetime;
SELECT 
  @thesmalldatetime AS 'smalldatetime',
  @thetime AS 'time';

Resultado:

+---------------------+----------+
| smalldatetime       | time     |
|---------------------+----------|
| 2025-05-21 10:16:00 | 10:16:00 |
+---------------------+----------+

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 en segundo plano cuando intentamos asignar el smalldatetime 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.

Lo que no obvio (al menos con mi ejemplo) es que el valor del tiempo en realidad puede manejar una fracción de segundos. Mi sistema no muestra las fracciones de segundo aquí, pero el siguiente ejemplo mostrará que, de hecho, tiene una precisión de fracciones de segundo de 7.

Además, si miras de cerca, verás que smalldatetime El valor redondeó los minutos desde el valor real que estaba tratando de asignarle. Esto refleja la precisión relativamente baja de smalldatetime tipo de datos. Su precisión es al minuto más cercano. La consecuencia obvia de esto es que cuando eventualmente reasignamos su valor al tiempo tipo de datos, es el valor redondeado que se asigna, no el valor inicial que traté de asignar. Si hubiéramos asignado el valor inicial directamente al tiempo variable, habríamos obtenido un valor más preciso (incluso si hubiéramos especificado una escala de 0).

Esto es lo que quiero decir:

DECLARE 
  @thesmalldatetime smalldatetime, 
  @thetime time(0);
SET @thesmalldatetime = '2025-05-21 10:15:30';
SET @thetime = '2025-05-21 10:15:30';
SELECT 
  @thesmalldatetime AS 'smalldatetime',
  @thetime AS 'time';

Resultado:

+---------------------+----------+
| smalldatetime       | time     |
|---------------------+----------|
| 2025-05-21 10:16:00 | 10:15:30 |
+---------------------+----------+

Ejemplo 2:sumar fracciones de segundo

La pequeña fecha y hora el tipo de datos no tiene una parte de segundos fraccionarios, pero en nuestro primer ejemplo, el tiempo El valor tiene una precisión de fracciones de segundo de 7 (aunque en realidad no muestra ningún lugar decimal). Conozco su precisión porque no especifiqué una escala al declararla, por lo que usa su escala predeterminada de 7.

Aquí hay un ejemplo para confirmar que el tiempo valor puede, de hecho, soportar una parte fraccionaria:

DECLARE 
  @thesmalldatetime smalldatetime, 
  @thetime time;
SET @thesmalldatetime = '2025-05-21 10:15:30';
SET @thetime = @thesmalldatetime;
SELECT 
  @thesmalldatetime AS 'smalldatetime',
  @thetime AS 'Original time',
  DATEADD(nanosecond, 123456700, @thetime) AS 'Modified time';

Resultado:

+---------------------+-----------------+------------------+
| smalldatetime       | Original time   | Modified time    |
|---------------------+-----------------+------------------|
| 2025-05-21 10:16:00 | 10:16:00        | 10:16:00.1234567 |
+---------------------+-----------------+------------------+

Tenga en cuenta que cuando el tiempo valor tiene una escala de 7, tiene un tamaño de almacenamiento de 5 bytes. Por lo tanto, tiene mayores requisitos de almacenamiento que el smalldatetime tipo (que utiliza sólo 4 bytes).

Ejemplo 3: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 smalldatetime y tiempo .

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

Resultado:

+---------------------+-----------+
| smalldatetime       | time(0)   |
|---------------------+-----------|
| 2025-05-21 10:16:00 | 10:16:00  |
+---------------------+-----------+

En este ejemplo puse la escala en 0.

Ejemplo 4: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 @thesmalldatetime smalldatetime;
SET @thesmalldatetime = '2025-05-21 10:15:30.125';
SELECT 
  @thesmalldatetime AS 'smalldatetime',
  CONVERT(time(0), @thesmalldatetime) AS 'time(0)';

Resultado:

+---------------------+-----------+
| smalldatetime       | time(0)   |
|---------------------+-----------|
| 2025-05-21 10:16:00 | 10:16:00  |
+---------------------+-----------+