SQL Server – Obtener el último día del mes

Bien pues, supongo que son bastante conocidas las funciones Dateadd y Datediff, pero sino aqui va una breve para los perdidos,

DATEADD (datepart , number , date )
  • datepart puede ser: year, quarter, month, dayofyear,day,week, weekday,hour, minute, second,milisecond,microsecond o nanosecond
  • number será lo que queremos agregar
  • date será la fecha a la que le queremos hacer la suma, entonces por ejemplo, select dateadd(day, 2, ‘20120101’) mostraría –> ‘20120103’
DATEDIFF ( datepart , startdate , enddate )
  • datepart puede ser igual que en Dateadd: year, quarter, month, dayofyear,day,week,weekday,hour,minute,second,milisecond,microsecond o nanosecond
  • startdate es la fecha que vamos a restar
  • endate es a la fecha que vamos a restar el valor en startdate, entonces por ejemplo, select datediff(month,’20121231′,’20120131′) mostraría –> -11
Bueno pues, ahora que sabemos esto, dejenme les cuento que hoy un compañero necesitaba sumarle a una fecha X un mes, lo cual en teoría se resolvería con un dateadd(month,1,FechaX), y claro pues, 
en teoría lo arregló, quedo el resultado algo así

Fecha Inicial   |   Fecha Mes Siguiente
'2012-08-14'        '2012-09-14'
'2012-09-30'        '2012-10-30'

y todo hubiera sido perfecto, de no ser por esos datos que puse en rojo, es decir, cierto del 30 de Septiembre al 30 de Octubre ha pasado un mes, sin embargo para usos practicos necesitabamos 
que el 30 de Septiembre se convierta en 31 de Octubre, para lo que se uso lo siguiente
  • select dateadd(ms,-3,DATEADD(mm, DATEDIFF(m,0,DATEADD(month, 1, FECHA_VENCIMIENTO)  )+1, 0))
aquí lo que se obtiene es con la siguiente funcion, el próximo mes a la FECHA_VENCIMIENTO
  • DATEDIFF(m,0,DATEADD(month, 1, FECHA_VENCIMIENTO)
Luego el resto de la funcion calculamos el ultimo día de dicho mes, para obtener en el caso del ejemplo el 31 de Octubre para el caso de que venga un 30 de Septiembre.

Espero que la explicación sea clara, de no serlo puedes dejar un comentario y con gusto amplio la explicación =)

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s