SQL -Operaciones con Fechas
Algunas Técnicas Obtenidas de la revista SQLMagazine marzo 2007 – junio 2007 por Itzik Ben-Gan.
Años como Números Enteros
0 – es el 01/01/1900 que fue LUNES
1- 02/01/1900 MARTES
2- 03/01/1900 MIERCOLES
3 – 04/01/1900 JUEVES
4 – 05/01/1900 VIERNES
5 – 06/01/1900 SABADO
6- 07/01/1900 DOMINGO
Extrayendo la parte de fecha a un valor DATETIME
al 01/01/1900 le sumo la cantidad de dias que transcurrieron a hoy
SELECT DATEADD(day,DATEDIFF(day,0,GETDATE()),0) , obteniendo la fecha de hoy sin la hora.
Obteniendo el primer día del mes
En forma análoga , obtenemos la cantidad de meses entre una fecha fija ( 01/01/1900) y luego se la sumamos, llevando al primer día del mes
SELECT DATEADD(month,DATEDIFF(month,0,GETDATE()),0)
Obteniendo el ultimo dia del mes
Obtenemos el primer dia del mes del mes siguiente, y le restamos un día
SELECT DATEADD(month,DATEDIFF(month,0,getdate())+1,0)-1
De forma analoga obtenemos el comienzo de la hora
SELECT DATEADD(HOUR,DATEDIFF(HOUR,0,GETDATE()),0)
Día de la semana -Independiente del lenguaje
weekday retonarna distintos valores según el lenguaje en que esté seteada la sesión, o la variable @@DATEFIRST
Una forma de que traiga valores independientes de éste seteo es:
SELECT DATEDIFF(day,0,GETDATE())%7+1
O sea el resto de dividir los días entre el 01-1-1900 ( lunes) y una fecha determinada( en el ejemplo ahora ) en 7 +1
ésto devolvera 1 para lunes, 2 para martes … 7 para domingo
Última ocurrencia de un día de la semana determinado
Esta expresion calcula la cantidad de días entre una fecha fija Lunes ( 01-01-1900) y la fecha de hoy, restandole los días que pasaron del último lunes.
SELECT DATEDIFF(day,0,GETDATE())/7*7
Entonces, para llegar al ultimo lunes, tomo esa fecha base y le agrego los días obtenidos en la expresion anterior
SELECT DATEADD(DAY,DATEDIFF(day,0,GETDATE())/7*7,0)
Si quisiera ver lo mismo para el martes anterior, sería
SELECT DATEADD(day,DATEDIFF(day,1,GETDATE())/7*7,1) (inclusiva)
Esta expresion es inclusiva, es decir si busco el ultimo lunes y resulta que hoy es lunes, retonarnará la fecha de hoy
Si quiero ver la equivalente exclusiva, es decir, si hoy es martes retonarnará el martes anterior al presente, restar uno a la fecha
SELECT DATEADD(day,DATEDIFF(day,1,GETDATE()-1)/7*7,1) (exclusiva)
Próxima Ocurrencia de un día de la semana
Formula inclusiva: se obtiene de agregar 7 a la forma exclusiva de la ultima ocurrencia
SELECT DATEADD(day,DATEDIFF(day,1,GETDATE()-1)/7*7+7,1)
Formula exclusiva: se obtiene agregando 7 a la forma inclusiva de la ultima ocurrencia
SELECT DATEADD(day,DATEDIFF(day,1,GETDATE())/7*7+7,1)
Cálculo del primer o último día de la semana de un mes
Hay que encontrar el primer día del presente mes y luego encontrar el próximo día de la semana buscado ( ej. lunes ) respecto a él
SELECT DATEADD(day,DATEDIFF(day,0,GETDATE()-1)/7*7+7,0) proximo lunes
SELECT DATEADD(month,DATEDIFF(month,0,GETDATE()),0) primer día del mes
Metiendo la segunda fórmula dentro de la primera, obtenemos el primer lunes del corriente mes:
SELECT DATEADD(day,DATEDIFF(day,0,DATEADD(month,DATEDIFF(month,0,GETDATE()),0)-1)/7*7+7,0)
Se pueden obtener de forma análoga el último día de semana de un mes.
Con combinaciones similares se puede obtener el primer y último día de semana de un año
Excelente el artículo, me ha sido de gran ayuda.
Muchas gracias, muy bueno
Muchisimas gracias.
me salvaste de una que no podía sacar