Hace poco tuve que hacer unas modificaciones de fechas en Base de Datos (SQL Server 2008). Voy a comentar unas SQL que me vinieron bien.
- Para obtener el último día del mes anterior a una fecha dada (siendo GETDATE() la fecha dada, puede sustituirse por una columna de tipo date/datetime)
- Para modificar la hora de un datetime (en este ejemplo, ponemos las 3:30 de la mañana)
Combinando estas SQL, cambio la fecha-hora al último día del mes anterior sin modificar la hora. Tengo que meter el substring, porque el time me devuelve los milisegundos, y eso no le mola nada al DATEADD (en este caso, el primer GETDATE() lo utilizo para obtener la fecha actual y sacar el último día del mes anterior, y el segundo GETDATE() para obtener la hora, pero este último lo puedo cambiar por un time en string, '03:30:00' para modificar la hora del último día del mes anterior)
SELECT DATEADD(day, DATEDIFF(day, 0, DATEADD(s, -1, DATEADD(mm, DATEDIFF(m, 0, GETDATE()), 0))), SUBSTRING(CONVERT(varchar, CONVERT(time, GETDATE())),1, 8))