Dias laborables en TSQL

18/10/2003 - 12:09 por BoosH | Informe spam
Buenas a todos,

solicito su ayuda para ver como se pueden calcular los dias laborables
existentes entre dos fechas. Solamente basta con quitar los fines de semana,
no tengo que hilar mas fino con festivos entre semana ni nada. Vamos, que no
tengo un calendario laboral.

Preguntas similare

Leer las respuestas

#1 Sérgio Monteiro
19/10/2003 - 02:47 | Informe spam
Podrias hacer algo como:

set dateformat dmy

select datediff(dd, getdate(), '01/12/2003')-(datediff(wk, getdate(),
'01/12/2003')*2)

select datediff(dd, getdate(), '01/12/2003'), datediff(wk, getdate(),
'01/12/2003'), datediff(dd, getdate(), '01/12/2003')-(datediff(wk,
getdate(), '01/12/2003')*2)

select datediff(dd, '20/10/2003', '01/12/2003'), datediff(wk,
'20/10/2003', '01/12/2003'), datediff(dd, '20/10/2003',
'01/12/2003')-(datediff(wk, '20/10/2003', '01/12/2003')*2)

regards,

Sérgio Monteiro - Brasil
www.sqlpass.org
"BoosH" escreveu na mensagem
news:eschp$
Buenas a todos,

solicito su ayuda para ver como se pueden calcular los dias laborables
existentes entre dos fechas. Solamente basta con quitar los fines de


semana,
no tengo que hilar mas fino con festivos entre semana ni nada. Vamos, que


no
tengo un calendario laboral.



Respuesta Responder a este mensaje
#2 BoosH
19/10/2003 - 11:20 | Informe spam
Gracias Sergio,

pero todavía falta algo. Si ejecutamos estas sentencias:

set dateformat dmy
set nocount on

print '01/10/2003 - 31/10/2003 Deberían ser 23 Días Laborables'
select datediff(dd, '01/10/2003', '31/10/2003') [Dif. Dias], datediff(wk,
'01/10/2003',
'31/10/2003') [Dif. Semanas], datediff(dd, '01/10/2003',
'31/10/2003')-(datediff(wk,
'01/10/2003', '31/10/2003')*2) [Dias Laborables]

print '01/10/2003 - 13/10/2003 Deberían ser 9 Días Laborables'
select datediff(dd, '01/10/2003', '13/10/2003')[Dif. Dias], datediff(wk,
'01/10/2003',
'13/10/2003') [Dif. Semanas], datediff(dd, '01/10/2003',
'13/10/2003')-(datediff(wk,
'01/10/2003', '13/10/2003')*2) [Dias Laborables]

print '01/10/2003 - 11/10/2003 Deberían ser 8 Días Laborables'
select datediff(dd, '01/10/2003', '11/10/2003')[Dif. Dias], datediff(wk,
'01/10/2003',
'11/10/2003') [Dif. Semanas], datediff(dd, '01/10/2003',
'11/10/2003')-(datediff(wk,
'01/10/2003', '11/10/2003')*2) [Dias Laborables]

print '01/10/2003 - 12/10/2003 Deberían ser 8 Días Laborables'
select datediff(dd, '01/10/2003', '12/10/2003')[Dif. Dias], datediff(wk,
'01/10/2003',
'12/10/2003') [Dif. Semanas], datediff(dd, '01/10/2003',
'12/10/2003')-(datediff(wk,
'01/10/2003', '12/10/2003')*2) [Dias Laborables]

print '01/10/2003 - 13/10/2003 Deberían ser 3 Días Laborables'
select datediff(dd, '01/10/2003', '3/10/2003')[Dif. Dias], datediff(wk,
'01/10/2003',
'3/10/2003') [Dif. Semanas], datediff(dd, '01/10/2003',
'3/10/2003')-(datediff(wk,
'01/10/2003', '3/10/2003')*2) [Dias Laborables]

set nocount off

Obtendremos estos resultados

01/10/2003 - 31/10/2003 Deberían ser 23 Días Laborables
Dif. Dias Dif. Semanas Dias Laborables
30 4 22

01/10/2003 - 13/10/2003 Deberían ser 9 Días Laborables
Dif. Dias Dif. Semanas Dias Laborables
12 2 8

01/10/2003 - 11/10/2003 Deberían ser 8 Días Laborables
Dif. Dias Dif. Semanas Dias Laborables
10 1 8

01/10/2003 - 12/10/2003 Deberían ser 8 Días Laborables
Dif. Dias Dif. Semanas Dias Laborables
11 2 7

01/10/2003 - 13/10/2003 Deberían ser 3 Días Laborables
Dif. Dias Dif. Semanas Dias Laborables
2 0 2

A pesar de no querer tener un calendario laboral, tampoco son exactos los
resultados.

Alguna idea más al respecto?

"Sérgio Monteiro" wrote in message
news:
Podrias hacer algo como:

set dateformat dmy

select datediff(dd, getdate(), '01/12/2003')-(datediff(wk, getdate(),
'01/12/2003')*2)

select datediff(dd, getdate(), '01/12/2003'), datediff(wk, getdate(),
'01/12/2003'), datediff(dd, getdate(), '01/12/2003')-(datediff(wk,
getdate(), '01/12/2003')*2)

select datediff(dd, '20/10/2003', '01/12/2003'), datediff(wk,
'20/10/2003', '01/12/2003'), datediff(dd, '20/10/2003',
'01/12/2003')-(datediff(wk, '20/10/2003', '01/12/2003')*2)

regards,

Sérgio Monteiro - Brasil
www.sqlpass.org
"BoosH" escreveu na mensagem
news:eschp$
> Buenas a todos,
>
> solicito su ayuda para ver como se pueden calcular los dias laborables
> existentes entre dos fechas. Solamente basta con quitar los fines de
semana,
> no tengo que hilar mas fino con festivos entre semana ni nada. Vamos,


que
no
> tengo un calendario laboral.
>
>
>


Respuesta Responder a este mensaje
#3 Liliana Sorrentino
20/10/2003 - 16:17 | Informe spam
Hola,
Te contesté en SQLMax pero suponiendo (mal) que los cálculos debían ser
sobre fechas de una tabla.
Probé las combinaciones de fechas que podrían presentarse, y si no olvidé
nada, esto debería funcionar.

Saludos... Liliana.

print '01/10/2003 - 31/10/2003 Deberían ser 23 Días Laborables'
select datediff(dd, '01/10/2003', '31/10/2003') [Dif. Dias],
datediff(wk, '01/10/2003', '31/10/2003') [Dif. Semanas],
datediff(dd, '01/10/2003', '31/10/2003') - (datediff(wk, '01/10/2003',
'31/10/2003')*2) +
case when DATEPART(dw,'01/10/2003') = 7 and DATEPART(dw,'31/10/2003') = 6
then -1
when DATEPART(dw,'01/10/2003') = 7 then 0
when DATEPART(dw,'31/10/2003') < 6 or DATEPART(dw,'31/10/2003') = 7
then 1
else 0 end [Dias Laborables]


"BoosH" escribió en el mensaje
news:#
Gracias Sergio,

pero todavía falta algo. Si ejecutamos estas sentencias:

set dateformat dmy
set nocount on

print '01/10/2003 - 31/10/2003 Deberían ser 23 Días Laborables'
select datediff(dd, '01/10/2003', '31/10/2003') [Dif. Dias], datediff(wk,
'01/10/2003',
'31/10/2003') [Dif. Semanas], datediff(dd, '01/10/2003',
'31/10/2003')-(datediff(wk,
'01/10/2003', '31/10/2003')*2) [Dias Laborables]

print '01/10/2003 - 13/10/2003 Deberían ser 9 Días Laborables'
select datediff(dd, '01/10/2003', '13/10/2003')[Dif. Dias], datediff(wk,
'01/10/2003',
'13/10/2003') [Dif. Semanas], datediff(dd, '01/10/2003',
'13/10/2003')-(datediff(wk,
'01/10/2003', '13/10/2003')*2) [Dias Laborables]

print '01/10/2003 - 11/10/2003 Deberían ser 8 Días Laborables'
select datediff(dd, '01/10/2003', '11/10/2003')[Dif. Dias], datediff(wk,
'01/10/2003',
'11/10/2003') [Dif. Semanas], datediff(dd, '01/10/2003',
'11/10/2003')-(datediff(wk,
'01/10/2003', '11/10/2003')*2) [Dias Laborables]

print '01/10/2003 - 12/10/2003 Deberían ser 8 Días Laborables'
select datediff(dd, '01/10/2003', '12/10/2003')[Dif. Dias], datediff(wk,
'01/10/2003',
'12/10/2003') [Dif. Semanas], datediff(dd, '01/10/2003',
'12/10/2003')-(datediff(wk,
'01/10/2003', '12/10/2003')*2) [Dias Laborables]

print '01/10/2003 - 13/10/2003 Deberían ser 3 Días Laborables'
select datediff(dd, '01/10/2003', '3/10/2003')[Dif. Dias], datediff(wk,
'01/10/2003',
'3/10/2003') [Dif. Semanas], datediff(dd, '01/10/2003',
'3/10/2003')-(datediff(wk,
'01/10/2003', '3/10/2003')*2) [Dias Laborables]

set nocount off

Obtendremos estos resultados

01/10/2003 - 31/10/2003 Deberían ser 23 Días Laborables
Dif. Dias Dif. Semanas Dias Laborables
30 4 22

01/10/2003 - 13/10/2003 Deberían ser 9 Días Laborables
Dif. Dias Dif. Semanas Dias Laborables
12 2 8

01/10/2003 - 11/10/2003 Deberían ser 8 Días Laborables
Dif. Dias Dif. Semanas Dias Laborables
10 1 8

01/10/2003 - 12/10/2003 Deberían ser 8 Días Laborables
Dif. Dias Dif. Semanas Dias Laborables
11 2 7

01/10/2003 - 13/10/2003 Deberían ser 3 Días Laborables
Dif. Dias Dif. Semanas Dias Laborables
2 0 2

A pesar de no querer tener un calendario laboral, tampoco son exactos los
resultados.

Alguna idea más al respecto?

"Sérgio Monteiro" wrote in message
news:
> Podrias hacer algo como:
>
> set dateformat dmy
>
> select datediff(dd, getdate(), '01/12/2003')-(datediff(wk, getdate(),
> '01/12/2003')*2)
>
> select datediff(dd, getdate(), '01/12/2003'), datediff(wk, getdate(),
> '01/12/2003'), datediff(dd, getdate(), '01/12/2003')-(datediff(wk,
> getdate(), '01/12/2003')*2)
>
> select datediff(dd, '20/10/2003', '01/12/2003'), datediff(wk,
> '20/10/2003', '01/12/2003'), datediff(dd, '20/10/2003',
> '01/12/2003')-(datediff(wk, '20/10/2003', '01/12/2003')*2)
>
> regards,
>
> Sérgio Monteiro - Brasil
> www.sqlpass.org
> "BoosH" escreveu na mensagem
> news:eschp$
> > Buenas a todos,
> >
> > solicito su ayuda para ver como se pueden calcular los dias laborables
> > existentes entre dos fechas. Solamente basta con quitar los fines de
> semana,
> > no tengo que hilar mas fino con festivos entre semana ni nada. Vamos,
que
> no
> > tengo un calendario laboral.
> >
> >
> >
>
>


Respuesta Responder a este mensaje
#4 BoosH
21/10/2003 - 17:00 | Informe spam
Hola a todos,

al final, la mejor solución que he encontrado (a mi me lo parece), e
implementado es la siguiente.
Primero buscamos cuantos días festivos ha habido (sabados y domingos) y
luego se los resto a los días naturales transcurridos.
Eso si, se basa en que el primer día de la semana es lunes, si no, no
funciona.

SET DATEFIRST 1

declare @fecha1 datetime
declare @fecha2 datetime

select @fecha1=convert(datetime,'01/1/2003',103)
select @fecha2=convert(datetime,'31/12/2003',103)

select
datediff(day,@fecha1,@fecha2)+1-(

floor(((datepart(weekday,@fecha1)+datediff(day,@fecha1,@fecha2)-6)/7.0)+1.0)
-(ceiling(datepart(weekday,@fecha1)/6.0)-1) +

floor(((datepart(weekday,@fecha1)+datediff(day,@fecha1,@fecha2)-7)/7.0)+1.0)
) ,

floor(((datepart(weekday,@fecha1)+datediff(day,@fecha1,@fecha2)-6)/7.0)+1.0)
-(ceiling(datepart(weekday,@fecha1)/6.0)-1) as sabados,

floor(((datepart(weekday,@fecha1)+datediff(day,@fecha1,@fecha2)-7)/7.0)+1.0)
as domingos,

floor(((datepart(weekday,@fecha1)+datediff(day,@fecha1,@fecha2)-6)/7.0)+1.0)
-(ceiling(datepart(weekday,@fecha1)/6.0)-1) +

floor(((datepart(weekday,@fecha1)+datediff(day,@fecha1,@fecha2)-7)/7.0)+1.0)
as festivos

Gracias a todos por vuestra ayuda.

"BoosH" wrote in message
news:eschp$
Buenas a todos,

solicito su ayuda para ver como se pueden calcular los dias laborables
existentes entre dos fechas. Solamente basta con quitar los fines de


semana,
no tengo que hilar mas fino con festivos entre semana ni nada. Vamos, que


no
tengo un calendario laboral.



email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida