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

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

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

Cuando conviertes una hora valor para smalldatetime , la fecha se establece en '1900-01-01' y los valores de hora y minuto se redondean. Los segundos y las fracciones de segundo se establecen en 0.

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

DECLARE @thetime time;
SET @thetime = '23:15:59.1234567';
SELECT 
  @thetime AS 'time',
  CAST(@thetime AS smalldatetime) AS 'smalldatetime';

Resultado:

+------------------+---------------------+
| time             | smalldatetime       |
|------------------+---------------------|
| 23:15:59.1234567 | 1900-01-01 23:16:00 |
+------------------+---------------------+

Entonces, se agrega una parte de la fecha y se establece en '1900-01-01' y, en este caso, los valores de los minutos se redondean y los segundos se establecen en 0.

La documentación de Microsoft establece que las fracciones de segundo también se establecen en cero, pero el smalldatetime el tipo de datos no incluye segundos fraccionarios de todos modos.

Por cierto, cada vez que uses el smalldatetime tipo de datos, el componente de segundos siempre se establece en 0.

Ejemplo 2:Redondeo de la hora

Aquí hay un ejemplo de la hora redondeada:

DECLARE @thetime time(0);
SET @thetime = '10:59:59';
SELECT 
  @thetime AS 'time',
  CAST(@thetime AS smalldatetime) AS 'smalldatetime';

Resultado:

+----------+---------------------+
| time     | smalldatetime       |
|----------+---------------------|
| 10:59:59 | 1900-01-01 11:00:00 |
+----------+---------------------+

En este caso, también especifiqué una escala de 0 para el valor de tiempo, sin embargo, esto no afecta el resultado.

Para que quede claro, escala es el número de dígitos a la derecha del punto decimal en un número. Precisión es el número total de dígitos en el número. Cuando especificamos una escala de 0, significa que la parte fraccionaria no está incluida.

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

Aquí hay un ejemplo usando CONVERT() función en lugar de CAST() .

DECLARE @thetime time;
SET @thetime = '23:15:59.1234567';
SELECT 
  @thetime AS 'time',
  CONVERT(smalldatetime, @thetime) AS 'smalldatetime';

Resultado:

+------------------+---------------------+
| time             | smalldatetime       |
|------------------+---------------------|
| 23:15:59.1234567 | 1900-01-01 23:16:00 |
+------------------+---------------------+

Ejemplo 4:conversión implícita

Aquí hay un ejemplo de hacer lo mismo, pero usando una conversión de tipo implícita.

DECLARE @thetime time, @thesmalldatetime smalldatetime;
SET @thetime = '23:15:59.1234567';
SET @thesmalldatetime = @thetime;
SELECT 
  @thetime AS 'time',
  @thesmalldatetime AS 'smalldatetime';

Resultado:

+------------------+---------------------+
| time             | smalldatetime       |
|------------------+---------------------|
| 23:15:59.1234567 | 1900-01-01 23:16:00 |
+------------------+---------------------+

Entonces obtenemos el mismo resultado, independientemente de si se trata de una conversión explícita o implícita.

Esta es una conversión implícita porque no estamos usando una función de conversión para convertirla explícitamente. Simplemente estamos asignando el valor de una variable de un tipo de datos a una variable de otro tipo de datos. En este caso, SQL Server realiza una conversión implícita entre bastidores cuando intentamos asignar la hora valor a un smalldatetime variables.

Ejemplo 5:cambiar la fecha

Si necesita cambiar la fecha (pero mantener la misma hora), puede usar DATEADD() función.

DECLARE @thetime time, @thesmalldatetime smalldatetime;
SET @thetime = '23:15:59.1234567';
SET @thesmalldatetime = @thetime;
SET @thesmalldatetime = DATEADD(year, 85, @thesmalldatetime);
SELECT 
  @thetime AS 'time',
  @thesmalldatetime AS 'smalldatetime';

Resultado:

+------------------+---------------------+
| time             | smalldatetime       |
|------------------+---------------------|
| 23:15:59.1234567 | 1985-01-01 23:16:00 |
+------------------+---------------------+

En este caso, agrego 85 al valor del año, lo que lo lleva a 1985.

Sin embargo, tenga en cuenta que smalldatetime admite un rango de fechas muy estrecho (1900-01-01 a 2079-06-06), por lo que agregar demasiado al año podría generar un error de desbordamiento como el siguiente:

DECLARE @thetime time, @thesmalldatetime smalldatetime;
SET @thetime = '23:15:59.1234567';
SET @thesmalldatetime = @thetime;
SET @thesmalldatetime = DATEADD(year, 220, @thesmalldatetime);
SELECT 
  @thetime AS 'time',
  @thesmalldatetime AS 'smalldatetime';

Resultado:

Adding a value to a 'smalldatetime' column caused an overflow.