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

Ejemplos de conversión de 'fecha' a 'pequeña fecha y hora' en SQL Server (T-SQL)

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

Cuando conviertes una fecha valor para smalldatetime , se agrega información adicional al valor. Esto se debe a que smalldatetime 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.

Sin embargo, hay casos en los que una fecha a pequeña fecha y hora la conversión podría fallar. En particular, si la fecha el valor está fuera del rango admitido por smalldatetime entonces fallará con un error.

En cualquier caso, a continuación se muestran ejemplos de conversión entre estos dos tipos de datos.

Ejemplo 1:conversión implícita

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

DECLARE @thedate date, @thesmalldatetime smalldatetime
SET @thedate = '2020-12-01'
SET @thesmalldatetime = @thedate
SELECT 
  @thedate AS 'date',
  @thesmalldatetime AS 'smalldatetime';

Resultado:

+------------+---------------------+
| date       | smalldatetime       |
|------------+---------------------|
| 2020-12-01 | 2020-12-01 00:00: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 la fecha valor a un smalldatetime variables.

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

Cuando convierte entre fecha y pequeña fecha y hora , el componente de tiempo se establece en 00:00:00 . Esto proporciona una precisión al minuto.

La razón por la que son todos 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).

Por supuesto, también obtiene este resultado incluso si simplemente asigna un valor de solo fecha a un smalldatetime sin realizar una conversión:

DECLARE @thesmalldatetime smalldatetime = '2020-12-01'
SELECT @thesmalldatetime AS 'smalldatetime';

Resultado:

+---------------------+
| smalldatetime       |
|---------------------|
| 2020-12-01 00:00:00 |
+---------------------+

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, @thesmalldatetime smalldatetime
SET @thedate = '2020-12-01'
SET @thesmalldatetime = @thedate
SET @thesmalldatetime = DATEADD(hour, 7, @thesmalldatetime)
SELECT 
  @thedate AS 'date',
  @thesmalldatetime AS 'smalldatetime';

Resultado:

+------------+---------------------+
| date       | smalldatetime       |
|------------+---------------------|
| 2020-12-01 | 2020-12-01 07:00:00 |
+------------+---------------------+

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

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

Resultado:

+------------+---------------------+
| date       | smalldatetime       |
|------------+---------------------|
| 2020-12-01 | 2020-12-01 00:00:00 |
+------------+---------------------+

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, 7, CAST(@thedate AS smalldatetime)) AS 'smalldatetime';

Resultado:

+------------+---------------------+
| date       | smalldatetime       |
|------------+---------------------|
| 2020-12-01 | 2020-12-01 07:00:00 |
+------------+---------------------+

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(smalldatetime, @thedate) AS 'smalldatetime';

Resultado:

+------------+---------------------+
| date       | smalldatetime       |
|------------+---------------------|
| 2020-12-01 | 2020-12-01 00:00:00 |
+------------+---------------------+

Y ajustando la hora:

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

Resultado:

+------------+---------------------+
| date       | smalldatetime       |
|------------+---------------------|
| 2020-12-01 | 2020-12-01 07:00:00 |
+------------+---------------------+

Ejemplo 5:error fuera de rango

Como se mencionó, si la fecha está fuera del rango admitido por smalldatetime tipo de datos, obtendrá un error.

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

Resultado:

The conversion of a date data type to a smalldatetime data type resulted in an out-of-range value.

La pequeña fecha y hora el tipo de datos solo admite intervalos de fechas del 1900-01-01 al 2079-06-06.

Además, el smalldatetime El tipo de datos solo admite rangos de tiempo de 00:00:00 a 23:59:59, por lo que también obtendrá un error si intenta usar un valor fuera de ese rango (por ejemplo, con una mayor precisión).

Ejemplo:

DECLARE @thedate date
SET @thedate = '2020-12-01'
SELECT 
  @thedate AS 'date',
  DATEADD(nanosecond, 7, CAST(@thedate AS smalldatetime)) AS 'smalldatetime';

Resultado:

The datepart nanosecond is not supported by date function dateadd for data type smalldatetime.

Sin embargo, en este caso, no es un error al convertir, en realidad es un error al usar DATEADD() función (porque la función no permite que esa parte de fecha en particular se use en un smalldatetime tipo de datos).