2014/11/11

HORARIO DE VERANO

Una aplicación práctica para nuestra tabla de números y fechas, es el cálculo de las fechas de entrada y salida de horarios de verano de cada año. Como podemos lograr tal cosa, de una manera muy simple con nuestra tabla, pero primero, como lo logramos sin usar nuestra tabla:
SET DATEFIRST 7

DECLARE @fechaAbril DATETIME = '20140401'

SELECT 
--a) ULTIMO DIA DEL MES ANTERIOR
DATEADD( M, DATEDIFF( M,'19000101' , @fechaAbril ), '19000101' )-1 ,
--NUMERO DE DIA DE LA SEMANA DE (a)
DATEPART( WEEKDAY,DATEADD( M, DATEDIFF( M,'19000101' , @fechaAbril ), '19000101' )-1 ),
--b)DIFERENCIA ENTRE EL PROXIMO DOMINGO SIGUIENTE A LA FECHA (a)
8-DATEPART( WEEKDAY,DATEADD( M, DATEDIFF( M,'19000101' , @fechaAbril ), '19000101' )-1 ),
--c) SUMAMOS LA DIFERENCIA (b) A LA FECHA (a)
 DATEADD( D, 8-DATEPART( WEEKDAY,DATEADD( M, DATEDIFF( M,'19000101' , @fechaAbril ), '19000101' )-1 ), DATEADD( M, DATEDIFF( M,'19000101' , @fechaAbril ), '19000101' )-1 )
 AS entradaVerano

DECLARE @fechaOctubre DATETIME = '20141001'
SELECT 
--a) PRIMER DIA DEL MES SIGUIENTE
DATEADD( M, DATEDIFF( M,'19000101' , @fechaOctubre )+1, '19000101' ) ,
--NUMERO DE DIA DE LA SEMANA DE (a)
DATEPART( WEEKDAY,DATEADD( M, DATEDIFF( M,'19000101' , @fechaOctubre )+1, '19000101' ) ),
--b)DIFERENCIA ENTRE EL ANTERIOR DOMINGO A LA FECHA (a)
-1*(DATEPART( WEEKDAY,DATEADD( M, DATEDIFF( M,'19000101' , @fechaOctubre )+1, '19000101' ) )-1) ,
--c) SUMAMOS LA DIFERENCIA (b) A LA FECHA (a)
DATEADD( D, -1*(DATEPART( WEEKDAY,DATEADD( M, DATEDIFF( M,'19000101' , @fechaOctubre )+1, '19000101' ) )-1) , DATEADD( M, DATEDIFF( M,'19000101' , @fechaOctubre )+1, '19000101' ) ) As salidaVerano

Y ahora, con nuestra tabla recién creada:
SELECT *
FROM tablaNumeros a
CROSS APPLY
( 
 SELECT TOP 1 b.fecha 
 FROM tablaNumeros b 
 WHERE a.numeroAnio = b.numeroAnio 
 AND b.numeroMes = 4
 AND b.numeroDiaSemana = 7
 ORDER BY b.fecha 
) AS ax1
CROSS APPLY
(
 SELECT TOP 1 c.fecha
 FROM tablaNumeros c
 WHERE a.numeroAnio = c.numeroAnio
 AND c.numeroMes = 10
 AND c.numeroDiaSemana = 7 
 ORDER BY c.fecha DESC
) AS ax2

Y de esta manera es como podemos obtener el resultado que esperamos, espero que les sirva.

SALUDOS!
COMPARTE ESTA INFORMACION SI TE PARECIO INTERESANTE

0 comentarios:

Publicar un comentario