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