Trabajando con fechas en SQL Server

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

Escribir un comentario