Discussion:
¿Cuantos dias hay entre dos fechas ...
(demasiado antiguo para responder)
Emilio Garcia Loeda
2004-02-05 15:11:10 UTC
Permalink
..., pero sin tener en cuante los fines de semana?

Deseo evitar el uso de cursores para saber la diferencia entre dos fechas
(no vale datediff()) pero teniendo en cuenta los fines de semana.

He sabido descontar entre dos fechas los festivos, utilizando una tabla
auxiliar (con los festivos), pero quiero evitar este metodo para los fines
de semana.

¿alguien de vosotros ya se ha enfrentado este problema?
¿como se resolvio?

SAludos

Emilio Gª Loeda

www.loeda.net
Maximiliano D. A.
2004-02-05 15:19:16 UTC
Permalink
Estimado, lo que vos queres hacer es sacar los dias habiles entre 2 fechas
verdad?

no veo otra opcion que implementes una Funcion definida por el usuario,
porque aca dependera sobre todo del calendario que debes tomar y muchos
otros factores mas.

No quedara que hacer un Algotirmo, la verdad que aca no lo tengo a mano pero
creo tener un ej de algo parecido, si lo encuentro lo envio.

Salu2
--
Maximiliano Damian Accotto
Post by Emilio Garcia Loeda
..., pero sin tener en cuante los fines de semana?
Deseo evitar el uso de cursores para saber la diferencia entre dos fechas
(no vale datediff()) pero teniendo en cuenta los fines de semana.
He sabido descontar entre dos fechas los festivos, utilizando una tabla
auxiliar (con los festivos), pero quiero evitar este metodo para los fines
de semana.
¿alguien de vosotros ya se ha enfrentado este problema?
¿como se resolvio?
SAludos
Emilio Gª Loeda
www.loeda.net
PEDRO HURTADO
2004-02-05 15:32:44 UTC
Permalink
utiliza datepart para saber el primer dia y el ultimo
entre las dos fechas, despues deberas saber las semanas
totales desde la primera semana + 1 de la fecha de inicio
hasta la ultima semana -1,multiplica las semanas * 5 y les
sumas los dias devueltos por datepart para la primera y la
ultima semana.
Espero que te sirva.
-----Mensaje original-----
...., pero sin tener en cuante los fines de semana?
Deseo evitar el uso de cursores para saber la diferencia
entre dos fechas
(no vale datediff()) pero teniendo en cuenta los fines de
semana.
He sabido descontar entre dos fechas los festivos,
utilizando una tabla
auxiliar (con los festivos), pero quiero evitar este
metodo para los fines
de semana.
¿alguien de vosotros ya se ha enfrentado este problema?
¿como se resolvio?
SAludos
Emilio Gª Loeda
www.loeda.net
.
Emilio Garcia Loeda
2004-02-05 15:54:33 UTC
Permalink
Ante todos gracias todos, al final tendre que realizar un SP_xxx , una
primera aproximación podria ser

declare @dateDesde as datetime --Fecha Inicio
declare @dateHasta as datetime --Fecha Final
declare @datePuntero as datetime --Puntero tipo Fecha
declare @intDiasDescanso as integer --nº de Sabados y Domingo

set @datedesde=Getdate()-4 -- Una fecha inicio cualquiera
set @dateHasta=getdate()+7 -- Una Fecha Final Cualquiera
set @intDiasDescanso=0

set @datePuntero=@datedesde -- Inicio el Puntero

while @datePuntero<=dateHasta
begin
if datepart(dw,@datePuntero) in (7,6) -- si el puntero es un
-- Sabado Domingo
set @intDiasDescanso=@intDiasDescanso+1 -- Sumo uno
set @datePuntero=@datePuntero+1 -- Incremento Puntero
end
Post by Emilio Garcia Loeda
..., pero sin tener en cuante los fines de semana?
Deseo evitar el uso de cursores para saber la diferencia entre dos
fechas (no vale datediff()) pero teniendo en cuenta los fines de
semana.
He sabido descontar entre dos fechas los festivos, utilizando una
tabla auxiliar (con los festivos), pero quiero evitar este metodo para
los fines de semana.
¿alguien de vosotros ya se ha enfrentado este problema?
¿como se resolvio?
SAludos
Emilio Gª Loeda
www.loeda.net
Emilio Garcia Loeda
2004-02-05 16:24:07 UTC
Permalink
Bueno os paso mi SP para determinar la cantidad de festivos entre dos
fecha (sin contar los fines de semana)

Nos hace falta una tabla auxiliar

CREATE TABLE [dbo].[festivos] (
[id] [int] IDENTITY (1, 1) NOT NULL ,
[fecha] [smalldatetime] NOT NULL ,
[descripcion] [varchar] (50) NULL ,
[provincia] [varchar] (50) NULL ,
[localidad] [varchar] (50) NULL
) ON [PRIMARY]
GO


El SP es el siguiente

/************************************************************************
**************/ /* Stored Procedure: sp_sift_festivos
*/ /* Creation Date: 05/02/2004 */
/* Copyright: Telsi S.A. */
/* Written by: Emilio Garcia Loeda */
/* */
/* Purpose: Actualizar los componentes */
/* */
/* Input Parameters: @strProvincia, provincia donde se ejecuta el SP
*/ /* Input Parameters: @strLocalidad, localidad donde se
ejecuta el SP */ /* Input Parameters: @strDesde, Fecha
inicial */ /* Input Parameters: @strHasta,
fecha FInal */ /* */
/* Output Parameters: @intDias, nº de dias festivos (sin fines semana)
*/ /* */
/* Return Status: Produción
*/ /* */
/* Usage: exec sp_sift_festivos
'Ourense','Ribadavia','01/01/2003','15/02/2004' */ /*
*/ /* Local Variables:
*/ /* */
/* Called By: .
*/ /* */
/* Calls: */
/* */
/* Data Modifications: Ninguna */
/* */
/* Updates: */
/* Date Author Purpose */
/* 05/02/2004 EGL */
/* */
/************************************************************************
**************/

CREATE procedure sp_sift_festivos
@strProvincia varchar(30),
@strLocalidad varchar(30),
@strDesde datetime,
@strHasta datetime,
@intDias integer output
as

set @strProvincia=ltrim(rtrim(@strProvincia))
set @strLocalidad=ltrim(rtrim(@strLocalidad))
set @strDesde=convert(char,@strDesde,112)
set @strHasta=convert(char,@strHasta,112)
set @intDias=0

select @intDias=count(*) from festivos
where convert(char,fecha,112) BETWEEN @strDesde and @strHasta
and (provincia=@strProvincia and (localidad=@strLocalidad or
localidad is NULL)) and datepart(dw,fecha) not in (6,7)
Post by Emilio Garcia Loeda
..., pero sin tener en cuante los fines de semana?
Deseo evitar el uso de cursores para saber la diferencia entre dos
fechas (no vale datediff()) pero teniendo en cuenta los fines de
semana.
He sabido descontar entre dos fechas los festivos, utilizando una
tabla auxiliar (con los festivos), pero quiero evitar este metodo para
los fines de semana.
¿alguien de vosotros ya se ha enfrentado este problema?
¿como se resolvio?
SAludos
Emilio Gª Loeda
www.loeda.net
Javier Loria
2004-02-05 16:33:28 UTC
Permalink
Hola Emilio:
Espero te sirva esta funcion definida de usuario:
===============================
CREATE FUNCTION dbo.DiasLaborales
( @FechaInicio datetime,
@FechaFinal datetime )
RETURNS INT
AS
BEGIN
IF (DATEPART(dw,@FechaInicio)=7)
BEGIN
SET @FechaInicio=DATEADD(dd,-1,@FechaInicio)
END
IF (DATEPART(dw,@FechaFinal)=7)
BEGIN
SET @FechaFinal=DATEADD(dd,-1,@FechaFinal)
END
RETURN
DATEDIFF(dd,@FechaInicio,@FechaFinal)
-(DATEDIFF(ww,
DATEADD(dd,7-DATEPART(dw,@FechaInicio), @FechaInicio),
DATEADD(dd,7-DATEPART(dw,@FechaFinal ), @FechaFinal))
*2)
END
===============================
Es una "traduccion" a SQL de un viejo algoritmo de C++ que usaba hace
anos, podrias revisarla bien, haciendo pruebas con muchas fechas, para ver
si te brinda los resultados deseados, tambien podrias restar lor feriados.
Si pudes cambiar tus tablas considera la posiblidad de en lugar de
contar con una tabla de festivos considera la posibilidad de tener una tabla
con TODOS los dias, y con una columna DiaHabil igual a 1 cuando lo sea y 0
para Fines de Semana o Festivos.
Saludos,


Javier Loria
Costa Rica
Se aprecia la inclusion de DDL (CREATE, INSERTS, etc.)
que pueda ser copiado y pegado al Query Analizer.
La version de SQL y Service Pack tambien ayuda.
Post by Emilio Garcia Loeda
..., pero sin tener en cuante los fines de semana?
Deseo evitar el uso de cursores para saber la diferencia entre dos
fechas (no vale datediff()) pero teniendo en cuenta los fines de
semana.
He sabido descontar entre dos fechas los festivos, utilizando una
tabla auxiliar (con los festivos), pero quiero evitar este metodo
para los fines de semana.
¿alguien de vosotros ya se ha enfrentado este problema?
¿como se resolvio?
SAludos
Emilio Gª Loeda
www.loeda.net
ulises
2004-02-05 20:16:02 UTC
Permalink
Muy bueno Javier, siguiendo tu consejo he creado una
funcion que forma una tabla con los sabados y domingos
entre dos fechas :

CREATE FUNCTION dbo.fn_obtieneFinSemana ( @fechaini
datetime, @fechafin datetime )
RETURNS @retFinSemana TABLE ( fecha datetime )
AS
BEGIN
DECLARE @fechaaux datetime
SET @fechaaux = @fechaini
WHILE ( @fechaaux < @fechafin )
BEGIN
IF DATEPART(dw,@fechaaux) = 7 OR DATEPART
(dw,@fechaaux) = 1
INSERT INTO @retFinSemana VALUES (
@fechaaux )
SET @fechaaux = @fechaaux + 1
END
RETURN
END

y luego solo restar en uan sentencia SELECT :

SELECT DATEDIFF(day,@fi,@ff) - ( SELECT count(*) FROM
dbo.fn_obtieneFinSemana(@fi,@ff))

Saludos,
Ulises
-----Mensaje original-----
===============================
CREATE FUNCTION dbo.DiasLaborales
@FechaFinal datetime )
RETURNS INT
AS
BEGIN
BEGIN
END
BEGIN
END
RETURN
-(DATEDIFF(ww,
@FechaInicio),
@FechaFinal))
*2)
END
===============================
Es una "traduccion" a SQL de un viejo algoritmo de
C++ que usaba hace
anos, podrias revisarla bien, haciendo pruebas con muchas
fechas, para ver
si te brinda los resultados deseados, tambien podrias
restar lor feriados.
Si pudes cambiar tus tablas considera la posiblidad
de en lugar de
contar con una tabla de festivos considera la posibilidad
de tener una tabla
con TODOS los dias, y con una columna DiaHabil igual a 1
cuando lo sea y 0
para Fines de Semana o Festivos.
Saludos,
Javier Loria
Costa Rica
Se aprecia la inclusion de DDL (CREATE, INSERTS, etc.)
que pueda ser copiado y pegado al Query Analizer.
La version de SQL y Service Pack tambien ayuda.
Emilio Garcia Loeda <emilio.loeda.NOSPAM-
Post by Emilio Garcia Loeda
..., pero sin tener en cuante los fines de semana?
Deseo evitar el uso de cursores para saber la
diferencia entre dos
Post by Emilio Garcia Loeda
fechas (no vale datediff()) pero teniendo en cuenta los
fines de
Post by Emilio Garcia Loeda
semana.
He sabido descontar entre dos fechas los festivos,
utilizando una
Post by Emilio Garcia Loeda
tabla auxiliar (con los festivos), pero quiero evitar
este metodo
Post by Emilio Garcia Loeda
para los fines de semana.
¿alguien de vosotros ya se ha enfrentado este problema?
¿como se resolvio?
SAludos
Emilio Gª Loeda
www.loeda.net
.
Emilio Garcia Loeda
2004-02-06 09:19:01 UTC
Permalink
Se agradece lo convertire un SP (tengo SQL 7)
Post by Javier Loria
===============================
CREATE FUNCTION dbo.DiasLaborales
@FechaFinal datetime )
RETURNS INT
AS
BEGIN
BEGIN
END
BEGIN
END
RETURN
-(DATEDIFF(ww,
*2)
END
===============================
Es una "traduccion" a SQL de un viejo algoritmo de C++ que usaba hace
anos, podrias revisarla bien, haciendo pruebas con muchas fechas, para
ver si te brinda los resultados deseados, tambien podrias restar lor
feriados.
Si pudes cambiar tus tablas considera la posiblidad de en lugar de
contar con una tabla de festivos considera la posibilidad de tener una
tabla con TODOS los dias, y con una columna DiaHabil igual a 1 cuando
lo sea y 0 para Fines de Semana o Festivos.
Saludos,
Javier Loria
Costa Rica
Se aprecia la inclusion de DDL (CREATE, INSERTS, etc.)
que pueda ser copiado y pegado al Query Analizer.
La version de SQL y Service Pack tambien ayuda.
Post by Emilio Garcia Loeda
..., pero sin tener en cuante los fines de semana?
Deseo evitar el uso de cursores para saber la diferencia entre dos
fechas (no vale datediff()) pero teniendo en cuenta los fines de
semana.
He sabido descontar entre dos fechas los festivos, utilizando una
tabla auxiliar (con los festivos), pero quiero evitar este metodo
para los fines de semana.
¿alguien de vosotros ya se ha enfrentado este problema?
¿como se resolvio?
SAludos
Emilio Gª Loeda
www.loeda.net
Loading...