Saltar al contenido

Cómo crear una fecha en SQL Server dado el día, el mes y el año como números enteros

Si te encuentras con algo que no comprendes puedes comentarlo y te ayudaremos lo mas rápido que podamos.

Solución:

En SQL Server 2012+, puede usar datefromparts():

select datefromparts(@year, @month, @day)

En versiones anteriores, puede emitir un string. Aquí hay un método:

select cast(cast(@year*10000 + @month*100 + @day as varchar(255)) as date)

En SQL Server 2012+, puede usar DATEFROMPARTS():

DECLARE @Year int = 2016, @Month int = 10, @Day int = 25;
SELECT DATEFROMPARTS (@Year, @Month, @Day);

En versiones anteriores, un método es crear y convertir un string.

Hay algunos string formatos de fecha que SQL Server interpreta de forma fiable independientemente de la fecha, el idioma o la configuración de internacionalización.

de seis u ocho dígitos string siempre se interpreta como ymd. El mes y el día deben ser siempre de dos dígitos.

https://docs.microsoft.com/en-us/sql/t-sql/data-types/datetime-transact-sql

entonces un string en el formato ‘aaaammdd’ siempre se interpretará correctamente.

(ISO 8601– YYYY-MM-DDThh:mm:ss— también funciona, pero debe especificar el tiempo y, por lo tanto, es más complicado de lo que necesita).

Si bien puede simplemente CAST esta string como fecha, debes usar CONVERT para especificar un estilo, y debe especificar un estilo para ser determinista (si eso le importa).

El formato “aaaammdd” es el estilo 112, por lo que su conversión se ve así:

DECLARE @Year int = 2016, @Month int = 10, @Day int = 25;
SELECT CONVERT(date,CONVERT(varchar(50),(@Year*10000 + @Month*100 + @Day)),112);

Y da como resultado:

2016-10-25

Técnicamente, el formato ISO/112/aaaammdd funciona incluso con otros estilos especificados. Por ejemplo, usando ese formato de texto con estilo 104 (alemán, dd.mm.yyyy):

DECLARE @Year int = 2016, @Month int = 10, @Day int = 25;
SELECT CONVERT(date,CONVERT(varchar(50),(@Year*10000 + @Month*100 + @Day)),104);

También sigue dando como resultado:

2016-10-25

Otros formatos no son tan robustos. Por ejemplo esto:

SELECT CASE WHEN CONVERT(date,'01-02-1900',110) = CONVERT(date,'01-02-1900',105) THEN 1 ELSE 0 END;

Resultados en:

0

Como nota al margen, con este método, tenga en cuenta que las entradas sin sentido pueden generar fechas válidas pero incorrectas:

DECLARE @Year int = 2016, @Month int = 0, @Day int = 1025;
SELECT CONVERT(date,CONVERT(varchar(50),(@Year*10000 + @Month*100 + @Day)),112);

También rinde:

2016-10-25

DATEFROMPARTS lo protege de entradas no válidas. Esta:

DECLARE @Year int = 2016, @Month int = 10, @Day int = 32;
SELECT DATEFROMPARTS (@Year, @Month, @Day);

Rendimientos:

Mensaje 289, Nivel 16, Estado 1, Línea 2 No se puede construir el tipo de datos fecha, algunos de los argumentos tienen valores que no son válidos.

También tenga en cuenta que este método no funciona para fechas anteriores al 1000-01-01. Por ejemplo:

DECLARE @Year int = 900, @Month int = 1, @Day int = 1;
SELECT CONVERT(date,CONVERT(varchar(50),(@Year*10000 + @Month*100 + @Day)),112);

Rendimientos:

Mensaje 241, nivel 16, estado 1, línea 2 La conversión falló al convertir la fecha y/o la hora del carácter string.

Eso es porque el resultado string, ‘9000101’, no tiene el formato ‘aaaammdd’. Para garantizar un formato adecuado, tendría que rellenarlo con ceros a la izquierda, sacrificando una pequeña cantidad de rendimiento. Por ejemplo:

DECLARE @Year int = 900, @Month int = 1, @Day int = 1;
SELECT CONVERT(date,RIGHT('000' + CONVERT(varchar(50),(@Year*10000 + @Month*100 + @Day)),8),112);

Resultados en:

0900-01-01

Hay otros métodos aparte de string conversión. Varios se proporcionan en las respuestas a “Crear una fecha con T-SQL”. Un ejemplo notable consiste en crear la fecha agregando años, meses y días a la “fecha cero”.

(Esta respuesta se inspiró en la respuesta de Gordon Linoff, que amplié y proporcioné documentación y notas adicionales).

El siguiente código debería funcionar en todas las versiones del servidor sql, creo:

SELECT CAST(CONCAT(CAST(@Year AS VARCHAR(4)), '-',CAST(@Month AS VARCHAR(2)), '-',CAST(@Day AS VARCHAR(2))) AS DATE)

Si te ha resultado provechoso nuestro artículo, te agradeceríamos que lo compartas con el resto juniors y nos ayudes a difundir esta información.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *