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

Ejemplos de conversión de 'hora' a 'fechahora' en SQL Server (T-SQL)

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

Cuando conviertes una hora valor a fecha y hora , se agrega información adicional al valor. Esto se debe a que la fecha y hora tipo de datos contiene información de fecha y hora. El tiempo el tipo de datos, por otro lado, solo contiene información de tiempo. Por lo tanto, la información de la fecha se agrega al valor cuando realiza dicha conversión. Específicamente, la fecha se establece en '1900-01-01'.

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 fechahora .

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

Resultado:

+------------------+-------------------------+
| time             | datetime                |
|------------------+-------------------------|
| 23:15:59.0040070 | 1900-01-01 23:15:59.003 |
+------------------+-------------------------+

Cuando conviertes de tiempo a fechahora , el componente de fecha se establece en 1900-01-01 .

Observe también que el valor de tiempo en sí mismo se presenta de manera diferente en ambos tipos de datos. El tiempo el tipo de datos agrega un cero al final (porque tiene una mayor precisión:su escala predeterminada es 7). Por otro lado, datetime los valores utilizan una escala inferior y se redondean en incrementos de 0,000, 0,003 o 0,007 segundos. Si encuentra este problema, considere convertir a datetime2 en cambio.

Ejemplo 2:menor precisión/escala

En el ejemplo anterior, el tiempo El valor tenía una precisión de segundos fraccionarios más alta que datetime valor. Esto se debe a que usa una escala predeterminada de 7. Pero podemos cambiar esto a un valor más bajo si es necesario.

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. Podemos especificar la escala agregando un número entre paréntesis al tipo de datos.

Esto es lo que sucede si configuro explícitamente la hora valor para tener un menor escala que la datetime valor.

DECLARE @thetime time(0)
SET @thetime = '23:15:59.004007'
SELECT 
  @thetime AS 'time',
  CAST(@thetime AS datetime) AS 'datetime';

Resultado:

+----------+-------------------------+
| time     | datetime                |
|----------+-------------------------|
| 23:15:59 | 1900-01-01 23:15:59.000 |
+----------+-------------------------+

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

Esto es lo mismo que el primer ejemplo, excepto que esta vez uso el CONVERT() función en lugar de CAST() .

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

Resultado:

+------------------+-------------------------+
| time             | datetime                |
|------------------+-------------------------|
| 23:15:59.0040070 | 1900-01-01 23:15:59.003 |
+------------------+-------------------------+

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, @thedatetime datetime
SET @thetime = '23:15:59.004007'
SET @thedatetime = @thetime
SELECT 
  @thetime AS 'time',
  @thedatetime AS 'datetime';

Resultado:

+------------------+-------------------------+
| time             | datetime                |
|------------------+-------------------------|
| 23:15:59.0040070 | 1900-01-01 23:15:59.003 |
+------------------+-------------------------+

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 una fecha y hora variables.

Ejemplo 5:cambiar la fecha

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

DECLARE @thetime time, @thedatetime datetime
SET @thetime = '23:15:59.004007'
SET @thedatetime = @thetime
SET @thedatetime = DATEADD(year, 120, @thedatetime)
SELECT 
  @thetime AS 'time',
  @thedatetime AS 'datetime';

Resultado:

+------------------+-------------------------+
| time             | datetime                |
|------------------+-------------------------|
| 23:15:59.0040070 | 2020-01-01 23:15:59.003 |
+------------------+-------------------------+

En este caso, agrego 120 al valor del año, lo que lo lleva a 2020.