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

Ejemplos de conversión de 'fecha' a 'fechahora2' en SQL Server (T-SQL)

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

Cuando conviertes una fecha valor a datetime2 , se agrega información adicional al valor. Esto se debe a que datetime2 tipo de datos contiene información de fecha y hora. La fecha el tipo de datos, por otro lado, solo contiene información de fecha.

La fechahora2 el tipo de datos es básicamente una extensión de datetime tipo de datos. Tiene un rango de fechas más grande, una precisión fraccionaria predeterminada más grande y una precisión opcional especificada por el usuario.

En cualquier caso, el proceso de conversión es exactamente el mismo independientemente del tipo de datos. La única diferencia es la cantidad de información disponible entre fecha , fechahora y fechahora2 .

Ejemplo 1:conversión implícita

Este es un ejemplo de una conversión implícita entre fecha y fechahora2 .

DECLARE @thedate date, @thedatetime2 datetime2
SET @thedate = '2020-12-01'
SET @thedatetime2 = @thedate
SELECT 
  @thedate AS 'date',
  @thedatetime2 AS 'datetime2';

Resultado:

+------------+-----------------------------+
| date       | datetime2                   |
|------------+-----------------------------|
| 2020-12-01 | 2020-12-01 00:00:00.0000000 |
+------------+-----------------------------+

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 valor a un datetime2 variables.

Podemos ver que la fecha variable solo contiene información de fecha, mientras que datetime2 La variable contiene información de fecha y hora.

Además, obtenemos más información de tiempo de la que obtendríamos si la convirtiéramos a datetime tipo de datos.

Cuando convierte entre fecha y fechahora2 utilizando la precisión predeterminada (7), el componente de tiempo se establece en 00:00:00.0000000 (comparado con 00:00:00.000 para fechahora ). Puede reducir la precisión si lo prefiere (ver más abajo). Reducir la precisión también puede reducir la cantidad de espacio necesario para almacenar el valor.

La razón por la que el componente de tiempo es todo ceros es porque el valor de la fecha no contiene ninguna información de tiempo, por lo que no hay forma de que SQL Server sepa a qué hora desea (si corresponde).

Ejemplo 2:modificar la hora

Si necesita especificar una hora (pero mantener la misma fecha), puede usar DATEADD() función para hacer precisamente eso.

DECLARE @thedate date, @thedatetime2 datetime2
SET @thedate = '2020-12-01'
SET @thedatetime2 = @thedate
SET @thedatetime2 = DATEADD(hour, 8, @thedatetime2)
SELECT 
  @thedate AS 'date',
  @thedatetime2 AS 'datetime2';

Resultado:

+------------+-----------------------------+
| date       | datetime2                   |
|------------+-----------------------------|
| 2020-12-01 | 2020-12-01 08:00:00.0000000 |
+------------+-----------------------------+

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 fecha y fechahora2 .

DECLARE @thedate date
SET @thedate = '2020-12-01'
SELECT 
  @thedate AS 'date',
  CAST(@thedate AS datetime2) AS 'datetime2';

Resultado:

+------------+-----------------------------+
| date       | datetime2                   |
|------------+-----------------------------|
| 2020-12-01 | 2020-12-01 00:00:00.0000000 |
+------------+-----------------------------+

Entonces obtenemos el mismo resultado que la conversión implícita.

También podemos ajustar el tiempo así:

DECLARE @thedate date
SET @thedate = '2020-12-01'
SELECT 
  @thedate AS 'date',
  DATEADD(hour, 8, CAST(@thedate AS datetime2)) AS 'datetime2';

Resultado:

+------------+-----------------------------+
| date       | datetime2                   |
|------------+-----------------------------|
| 2020-12-01 | 2020-12-01 08:00:00.0000000 |
+------------+-----------------------------+

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 @thedate date
SET @thedate = '2020-12-01'
SELECT 
  @thedate AS 'date',
  CONVERT(datetime2, @thedate) AS 'datetime2';

Resultado:

+------------+-----------------------------+
| date       | datetime2                   |
|------------+-----------------------------|
| 2020-12-01 | 2020-12-01 00:00:00.0000000 |
+------------+-----------------------------+

Y ajustando la hora:

DECLARE @thedate date
SET @thedate = '2020-12-01'
SELECT 
  @thedate AS 'date',
  DATEADD(hour, 8, CONVERT(datetime2, @thedate)) AS 'datetime2';

Resultado:

+------------+-----------------------------+
| date       | datetime2                   |
|------------+-----------------------------|
| 2020-12-01 | 2020-12-01 08:00:00.0000000 |
+------------+-----------------------------+

Ejemplo 5:precisión

La fechahora2 tipo de datos le permite especificar la precisión (hasta el valor predeterminado 7). En otras palabras, no necesita usar los 7 dígitos completos si no los necesita.

Ejemplo:

DECLARE @thedate date
SET @thedate = '2020-12-01'
SELECT 
  @thedate AS 'date',
  CONVERT(datetime2(2), @thedate) AS 'datetime2(2)',
  CONVERT(datetime2(4), @thedate) AS 'datetime2(4)';

Resultado:

+------------+------------------------+--------------------------+
| date       | datetime2(2)           | datetime2(4)             |
|------------+------------------------+--------------------------|
| 2020-12-01 | 2020-12-01 00:00:00.00 | 2020-12-01 00:00:00.0000 |
+------------+------------------------+--------------------------+

Una ventaja de reducir la precisión es que también puede reducir la cantidad de espacio necesario para almacenar el valor. En particular, 6 bytes para precisión inferior a 3, 7 bytes para precisión 3 o 4, y todas las demás precisiones requieren 8 bytes. Sin embargo, tenga en cuenta que el primer byte se usa para almacenar la precisión, por lo que el valor real es el tamaño de almacenamiento indicado aquí más 1 byte adicional para almacenar la precisión.