Machetes Varios

apuntes varios erp cwa logic ( ahora SoftLand Logic ) – sql y veremos que otra cosa

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

junio 17, 2008 - Posted by | sql magazine, SQL Server, Transact SQL | ,

3 comentarios »

  1. Excelente el artículo, me ha sido de gran ayuda.

    Comentario por Alexander | junio 18, 2009 | Responder

  2. Muchas gracias, muy bueno

    Comentario por Roque | enero 8, 2011 | Responder

  3. Muchisimas gracias.

    me salvaste de una que no podía sacar

    Comentario por k3n0 | agosto 3, 2011 | Responder


Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: