viernes, 27 de diciembre de 2013

SQL para obtener fechas y modificar horas


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)
SELECT DATEADD(s,-1,DATEADD(mm, DATEDIFF(m,0,GETDATE()),0))
  • Para modificar la hora de un datetime (en este ejemplo, ponemos las 3:30 de la mañana)
SELECT DATEADD(day, DATEDIFF(day, 0, GETDATE()), '03:30:00')

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