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

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

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

Uno de los beneficios de convertir un datetime2 valor para smalldatetime es que reduce el tamaño de almacenamiento de 7, 8 o 9 bytes a 4 bytes. Sin embargo, pierdes precisión.

La fechahora2 El tipo de datos le permite especificar una precisión de fracciones de segundo de 0 a 7. Si no especifica esto, utilizará 7 (el valor predeterminado). Si especifica cero (0 ), su precisión será al segundo más cercano.

La pequeña fecha y hora el tipo de datos, por otro lado, no tiene segundos fraccionarios y su componente de segundos siempre se establece en cero (:00). Su precisión es al minuto más cercano.

Cuando conviertes un datetime2 valor para smalldatetime , se copia la fecha y la parte de la hora. El componente de segundos se establece en cero (independientemente del valor original del componente de segundos) y el tiempo se redondea al minuto más cercano. Se eliminan las fracciones de segundo.

Ejemplo 1:conversión implícita

Este es un ejemplo de una conversión implícita entre datetime2 y pequeña fecha y hora .

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

Resultado:

+-----------------------------+---------------------+
| datetime2                   | smalldatetime       |
|-----------------------------+---------------------|
| 2025-05-21 10:15:30.1234567 | 2025-05-21 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 entre bastidores cuando intentamos asignar el datetime2 valor a un smalldatetime variables.

En este ejemplo podemos ver que smalldatetime el valor no incluye los segundos fraccionarios, los segundos se han establecido en cero y el minuto se ha redondeado.

En este caso, el datetime2 value utiliza una precisión de 7. Esto se debe a que 7 es el valor predeterminado. No especifiqué una precisión y, por lo tanto, se utilizó el valor predeterminado.

Pero habría devuelto el mismo resultado independientemente de la precisión que elegí. Incluso si lo redujera a cero (es decir, lo declarara como datetime2(0) ), aún habría devuelto el mismo resultado.

Ejemplo 2: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 pequeña fecha y hora .

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

Resultado:

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

En este ejemplo, decidí usar una escala de cero para datetime2 valor (es decir, datetime2(0) ), sin embargo, esto no afecta el smalldatetime resultante valor.

Ejemplo 3: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(0);
SET @thedatetime2 = '2025-05-21 10:15:30';
SELECT 
  @thedatetime2 AS 'datetime2',
  CONVERT(smalldatetime, @thedatetime2) AS 'smalldatetime';

Resultado:

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