A menudo necesitamos trabajar con fechas en SQL Server y el formato que nos devuelve no es el que necesitamos o quizás necesitemos calcular el primer día del mes, ultimo día del trimestre actual, etc… en este articulo vamos a ver una serie de ejemplo muy sencillos utilizamos la fecha actual del sistema con la variable getdate() ¿Comenzamos?
Conversión de formato
Para convertir el formato de una fecha necesitamos utilizar la función convert que junto a un código preestablecido conseguiremos el formato que queremos. Vamos a ver unos ejemplos:
-- mon dd yyyy hh:mmAM (or PM) - Oct 30 2020 18:20PM SELECT convert(varchar, getdate(), 100) -- mm/dd/yyyy - 10/30/2020 SELECT convert(varchar, getdate(), 101) -- yyyy.mm.dd – 2020.10.30 SELECT convert(varchar, getdate(), 102) -- dd/mm/yyyy - 30/10/2020 SELECT convert(varchar, getdate(), 103) -- dd.mm.yyyy - 30.10.2020 SELECT convert(varchar, getdate(), 104) -- dd-mm-yyyy - 30-10-2020 SELECT convert(varchar, getdate(), 105) -- dd mon yyyy - 30 Oct 2020 SELECT convert(varchar, getdate(), 106) -- mon dd, yyyy - Oct 30, 2020 SELECT convert(varchar, getdate(), 107) -- hh:mm:ss - 18:22:29 SELECT convert(varchar, getdate(), 108) -- mon dd yyyy hh:mm:ss:mmmAM (or PM) - Oct 30 2020 18:22:36:883PM SELECT convert(varchar, getdate(), 109) -- mm-dd-yyyy - 10-30-2020 SELECT convert(varchar, getdate(), 110) -- yyyy/mm/dd - 2020/10/30 SELECT convert(varchar, getdate(), 111) -- yyyymmdd - 20201030 SELECT convert(varchar, getdate(), 112) -- dd mon yyyy hh:mm:ss:mmm - 30 Oct 2020 18:23:04:530 SELECT convert(varchar, getdate(), 113) -- hh:mm:ss:mmm(24h) - 18:23:26:927 SELECT convert(varchar, getdate(), 114) -- yyyy-mm-dd hh:mm:ss(24h) - 2020-10-30 18:23:37 SELECT convert(varchar, getdate(), 120) -- yyyy-mm-dd hh:mm:ss.mmm - 2020-10-30 18:23:44.063 SELECT convert(varchar, getdate(), 121) -- yyyy-mm-ddThh:mm:ss.mmm - 2020-10-30T18:23:54.553 SELECT convert(varchar, getdate(), 126)
Cálculo de fechas
En otras ocasiones necesitaremos ademas de cambiar el formato de la fecha calcular un día especifico como el día anterior, el trimestral actual y un sin fin de casuísticas. Vamos a ver unos ejemplos con la fecha del sistema que es 30/10/2020:
--Fecha actual - 2020-10-30 SELECT CONVERT(DATE,GETDATE()) --Día actual - 30 SELECT DATEPART(DAY,GETDATE()) --Nº Semana Actual - 44 SELECT DATEPART(WEEK,GETDATE()) --Nº Día de la semana - 6 SELECT DATEPART(WEEKDAY,GETDATE()) --Nombre del día de la semana - Friday SELECT DATENAME(WEEKDAY,GETDATE()) --Mes actual - 10 SELECT DATEPART(MONTH,GETDATE()) --Nombre del mes - October SELECT DATENAME(MONTH,GETDATE()) --Trimestre actual - 4 SELECT DATEPART(QUARTER,GETDATE()) --Hoy menos 30 días - 2020-09-30 18:03:22.553 SELECT DATEADD(DAY, -30, GETDATE()) --Mismo día del mes siguiente - 2020-11-30 18:03:34.767 SELECT DATEADD(MONTH, 1, GETDATE()) --Mismo dia del año anterior - 2019-10-30 18:03:45.093 SELECT DATEADD(YEAR, -1, GETDATE()) --Primer día del año anterior - 2019-01-01 00:00:00.000 SELECT DATEADD(yy, DATEDIFF(yy, 0, GETDATE()) - 1, 0) --Ultimo día del año anterior - 2019-12-31 00:00:00.000 SELECT DATEADD(dd, -1, DATEADD(yy, DATEDIFF(yy, 0, GETDATE()), 0)) --Primer dia año actual - 2020-01-01 00:00:00.000 SELECT DATEADD(yy, DATEDIFF(yy, 0, GETDATE()), 0) --Primer día del mes (dd/mm/yyyy) - 01/10/2020 SELECT CONVERT(VARCHAR(10),DATEADD(dd,-(DAY(GETDATE())-1),GETDATE()),103) --Primer dia del trimester actual - 2020-10-01 SELECT CONVERT(DATE, DATEADD(QQ, DATEDIFF(QQ, 0, GETDATE()) ,0)) --Ultimo dia del trimester actual - 2020-12-31 SELECT CONVERT(DATE,DATEADD(d, -1, DATEADD(q, DATEDIFF(q, 0, GETDATE()) +1, 0))) --Primer dia del siguiente trimestre - 2021-01-01 SELECT CONVERT(DATE, DATEADD(QQ, DATEDIFF(QQ, 0, GETDATE()) +1 ,0)) --Ultimo día del siguiente trimestre - 2021-03-31 SELECT CONVERT(DATE,DATEADD(d, -1, DATEADD(q, DATEDIFF(q, 0, GETDATE()) +2, 0))) --Ultimo dia del trimestre anterior - 2020-06-30 SELECT CONVERT(DATE,DATEADD(d, -1, DATEADD(q, DATEDIFF(q, 0, GETDATE()) -1, 0)))