Este artículo contiene ejemplos de conversión de un valor de fecha a un valor de smalldatetime en SQL Server.
Cuando se convierte un valor de fecha a smalldatetime, se añade información extra al valor. Esto se debe a que el tipo de datos smalldatetime contiene tanto información de fecha como de hora. El tipo de datos date, por otro lado, sólo contiene información de fecha.
Sin embargo, hay casos en los que una conversión de date a smalldatetime podría fallar. En particular, si el valor de la fecha está fuera del rango soportado por smalldatetime entonces fallará con un error.
En cualquier caso, a continuación hay ejemplos de conversión entre estos dos tipos de datos.
Ejemplo 1 – Conversión implícita
Aquí hay un ejemplo de conversión implícita entre date y smalldatetime.
DECLARE @thedate date, @thesmalldatetime smalldatetimeSET @thedate = '2020-12-01'SET @thesmalldatetime = @thedateSELECT @thedate AS 'date', @thesmalldatetime AS 'smalldatetime';
Resultado:
+------------+---------------------+| date | smalldatetime ||------------+---------------------|| 2020-12-01 | 2020-12-01 00:00:00 |+------------+---------------------+
Se trata de una conversión implícita porque no estamos utilizando una función de conversión (como las siguientes) para convertirla explícitamente. En este caso, SQL Server realiza una conversión implícita entre bastidores cuando intentamos asignar el valor de la fecha a una variable smalldatetime.
Podemos ver que la variable date sólo contiene información de fecha, mientras que, la variable smalldatetime contiene tanto información de fecha como de hora.
Cuando se convierte entre date y smalldatetime, el componente de tiempo se establece en 00:00:00
. Esto proporciona una precisión al minuto.
La razón por la que es todo ceros es porque el valor de la fecha no contiene ninguna información de tiempo, por lo que no hay manera de que SQL Server sepa qué hora quiere (si es que hay alguna).
Por supuesto, también se obtiene este resultado incluso si simplemente se asigna un valor de sólo 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 utilizar la función DATEADD()
para hacerlo.
DECLARE @thedate date, @thesmalldatetime smalldatetimeSET @thedate = '2020-12-01'SET @thesmalldatetime = @thedateSET @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 con CAST()
Aquí tienes un ejemplo de conversión explícita. En este caso, utilizo la función CAST()
directamente dentro de la sentencia SELECT
para convertir explícitamente entre fecha y smalldatetime.
DECLARE @thedate dateSET @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 |+------------+---------------------+
El mismo resultado que la conversión implícita.
También podemos ajustar la hora así:
DECLARE @thedate dateSET @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 usando CONVERT()
Aquí tenemos un ejemplo de conversión explícita usando la función CONVERT()
en lugar de CAST()
.
DECLARE @thedate dateSET @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 dateSET @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 de Fuera de Rango
Como se ha mencionado, si la fecha está fuera del rango soportado por el tipo de datos smalldatetime, obtendrá un error.
DECLARE @thedate dateSET @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.
El tipo de datos smalldatetime sólo admite rangos de fechas de 1900-01-01 a 2079-06-06.
Además, el tipo de datos smalldatetime sólo admite rangos de tiempo de 00:00:00 a 23:59:59, por lo que también obtendrá un error si intenta utilizar un valor fuera de ese rango (por ejemplo, con una precisión mayor).
Ejemplo:
DECLARE @thedate dateSET @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 durante la conversión, es en realidad un error durante el uso de la función DATEADD()
(porque la función no permite que esa parte de la fecha en particular se utilice en un tipo de datos smalldatetime).