Fecha

15/11/2004 - 20:05 por Julio | Informe spam
Hola Grupo

Como puedo a la fecha actual sumarle 3 dias sin contar los fines de semana

Select getdate() + 3 sin fin de semana

Preguntas similare

Leer las respuestas

#6 Julio
17/11/2004 - 01:30 | Informe spam
Te lo agradecería Javier ya que tengo que poner la lista de los días
feriados de mi país, pero todavía aun no lo tenías resuelto ya que quería
resolver lo de los días de semana primero.

Si puede por favor me pasa el código completo con la tabla de días feriados


"Javier Loria" wrote in message
news:%23MZ39f%
Hola:
Este es un viejo posteo, prueba a ver si te funciona:
> 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ÚTEADD(dd,-1,@FechaInicio)
END
IF (DATEPART(dw,@FechaFinal)=7)
BEGIN
SET @FechaFinalÚTEADD(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
> En mi opinion es mejor idea la tabla de Dias con la columna de DiaHabil
y luego hacer un COUNT de los que tengan DiaHabil en 1, esto es mas
"extendible" ya que te permite incluir algunos dias no habiles feriados.
Si
es algo que te gustaria hacer puedo copiarte el codigo.
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

"Julio" wrote in message
news:
Saludos, Estuve realizando prueba con el código y observo que cuando la
fecha supera dos semana el solo asume un solo sábado y domingo.

Es decir si yo hoy martes 16 / 2004 se digo que con diferencia de 10
días,
debería de caer el día 30 sin embargo trae la fecha del 28



Es solo una observación, pero quería saber por si en el futuro se
presenta
algo como esto de tener que agregar más de 10 días



Gracias




"ulises" wrote in message
news:0ea001c4cb52$3ffc1b60$
Te podría servir algo como :

CREATE FUNCTION dbo.diamastres ( @fecha datetime )
RETURNS datetime
AS
BEGIN
DECLARE @diasemana int
DECLARE @fechamastres datetime
SET @diasemana = ( DATEPART(weekday,@fecha) + @@DATEFIRST -
1 ) % 7
IF @diasemana + 3 >= 6
SET @fechamastres = DATEADD(day,5,@fecha)
ELSE
SET @fechamastres = DATEADD(day,3,@fecha)
RETURN(@fechamastres)
END

pero no consistencia que el valor ingresado no sea un
sábado o domingo, si eso deseas deberás incluirlo.

Saludos,
Ulises

>Hola Grupo
>
>Como puedo a la fecha actual sumarle 3 dias sin contar los
fines de semana
>
>Select getdate() + 3 sin fin de semana
>
>
>.
>






Respuesta Responder a este mensaje
#7 Julio
17/11/2004 - 01:45 | Informe spam
Tengo una tabla para hacer requisiciones la cual tiene un campo llamado
fecha_requerida, esta fecha de ser igual a 7 dias laborables incluyendo los
dias de semana y los dias feriados.


CREATE TABLE [dbo].[RequisicionPorDepartamento] (
[RequisicionID] [int] IDENTITY (1, 1) NOT NULL ,
[RequisicionNumero] [varchar] (20) COLLATE SQL_Latin1_General_CP1_CI_AS NOT
NULL ,
[Fecha_Requerida] [datetime] NULL ,
[DepartamentoID] [varchar] (50) COLLATE SQL_Latin1_General_CP1_CI_AS NULL ,
[Empleado] [varchar] (100) COLLATE SQL_Latin1_General_CP1_CI_AS NULL ,
[Ubicacion] [varchar] (100) COLLATE SQL_Latin1_General_CP1_CI_AS NULL ,
[Suplidor] [varchar] (200) COLLATE SQL_Latin1_General_CP1_CI_AS NULL ,
[Condicion] [char] (10) COLLATE SQL_Latin1_General_CP1_CI_AS NULL ,
[prioridad] [char] (10) COLLATE SQL_Latin1_General_CP1_CI_AS NULL ,
[Anexo] [varchar] (500) COLLATE SQL_Latin1_General_CP1_CI_AS NULL ,
[Nota] [text] COLLATE SQL_Latin1_General_CP1_CI_AS NULL ,
[Fecha] [datetime] NULL ,
[Monto] [float] NULL
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO






"Julio" wrote in message
news:
Te lo agradecería Javier ya que tengo que poner la lista de los días
feriados de mi país, pero todavía aun no lo tenías resuelto ya que quería
resolver lo de los días de semana primero.

Si puede por favor me pasa el código completo con la tabla de días
feriados


"Javier Loria" wrote in message
news:%23MZ39f%
Hola:
Este es un viejo posteo, prueba a ver si te funciona:
>> 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ÚTEADD(dd,-1,@FechaInicio)
END
IF (DATEPART(dw,@FechaFinal)=7)
BEGIN
SET @FechaFinalÚTEADD(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
>> En mi opinion es mejor idea la tabla de Dias con la columna de
DiaHabil
y luego hacer un COUNT de los que tengan DiaHabil en 1, esto es mas
"extendible" ya que te permite incluir algunos dias no habiles feriados.
Si
es algo que te gustaria hacer puedo copiarte el codigo.
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

"Julio" wrote in message
news:
Saludos, Estuve realizando prueba con el código y observo que cuando la
fecha supera dos semana el solo asume un solo sábado y domingo.

Es decir si yo hoy martes 16 / 2004 se digo que con diferencia de 10
días,
debería de caer el día 30 sin embargo trae la fecha del 28



Es solo una observación, pero quería saber por si en el futuro se
presenta
algo como esto de tener que agregar más de 10 días



Gracias




"ulises" wrote in message
news:0ea001c4cb52$3ffc1b60$
Te podría servir algo como :

CREATE FUNCTION dbo.diamastres ( @fecha datetime )
RETURNS datetime
AS
BEGIN
DECLARE @diasemana int
DECLARE @fechamastres datetime
SET @diasemana = ( DATEPART(weekday,@fecha) + @@DATEFIRST -
1 ) % 7
IF @diasemana + 3 >= 6
SET @fechamastres = DATEADD(day,5,@fecha)
ELSE
SET @fechamastres = DATEADD(day,3,@fecha)
RETURN(@fechamastres)
END

pero no consistencia que el valor ingresado no sea un
sábado o domingo, si eso deseas deberás incluirlo.

Saludos,
Ulises

>Hola Grupo
>
>Como puedo a la fecha actual sumarle 3 dias sin contar los
fines de semana
>
>Select getdate() + 3 sin fin de semana
>
>
>.
>










Respuesta Responder a este mensaje
#8 Javier Loria
17/11/2004 - 15:42 | Informe spam
Hola:
Tal vez algocomo esto:
==CREATE TABLE Fechas(
Fecha SMALLDATETIME
NOT NULL PRIMARY KEY
CHECK(DATEPART(Hour,Fecha)=0 AND DATEPART(Minute,Fecha)=0)
, EsLaboral TINYINT
NOT NULL CHECK(EsLaboral IN (0,1))
DEFAULT 1
, EsFinSemana TINYINT
NOT NULL CHECK(EsFinSemana IN (0,1))
DEFAULT 0
)
INSERT Fechas(Fecha)
SELECT '2004/01/01' UNION ALL
SELECT '2004/01/02' UNION ALL
SELECT '2004/01/03' UNION ALL
SELECT '2004/01/04' UNION ALL
SELECT '2004/01/05'

INSERT Fechas(Fecha)
SELECT DATEADD(day, 5, Fecha) FROM Fechas UNION ALL
SELECT DATEADD(day, 10, Fecha) FROM Fechas UNION ALL
SELECT DATEADD(day, 15, Fecha) FROM Fechas UNION ALL
SELECT DATEADD(day, 20, Fecha) FROM Fechas

INSERT Fechas(Fecha)
SELECT DATEADD(day, 25, Fecha) FROM Fechas UNION ALL
SELECT DATEADD(day, 50, Fecha) FROM Fechas UNION ALL
SELECT DATEADD(day, 75, Fecha) FROM Fechas UNION ALL
SELECT DATEADD(day, 100, Fecha) FROM Fechas

INSERT Fechas(Fecha)
SELECT DATEADD(day, 125, Fecha) FROM Fechas UNION ALL
SELECT DATEADD(day, 250, Fecha) FROM Fechas WHERE DATEADD(day, 250,
Fecha)<'2005/01/01'

INSERT Fechas(Fecha)
SELECT DATEADD(day, 366, Fecha) FROM Fechas WHERE DATEADD(day, 366,
Fecha)<'2006/01/01'
UNION ALL
SELECT DATEADD(day, 731, Fecha) FROM Fechas WHERE DATEADD(day, 731,
Fecha)<'2007/01/01'
UNION ALL
SELECT DATEADD(day, 1096, Fecha) FROM Fechas WHERE DATEADD(day, 1096,
Fecha)<'2008/01/01'

INSERT Fechas(Fecha)
SELECT DATEADD(day, 1461, Fecha) FROM Fechas
UNION ALL
SELECT DATEADD(day, 2922, Fecha) FROM Fechas
UNION ALL
SELECT DATEADD(day, 4383, Fecha) FROM Fechas
UNION ALL
SELECT DATEADD(day, 5844, Fecha) FROM Fechas

UPDATE Fechas
SET EsLaboral=0
, EsFinSemana=1
FROM Fechas
WHERE DATEPART(dw, Fecha) IN (1,7)

UPDATE Fechas
SET EsLaboral=0
FROM Fechas
WHERE (DATEPART(Day,Fecha)=1 AND DATEPART(Month,Fecha)=1)
OR (DATEPART(Day,Fecha)% AND DATEPART(Month,Fecha))

GO
CREATE FUNCTION dbo.AgregaDiasLaborales(
@FechaInicio AS SMALLDATETIME
, @NumeroDias AS INTEGER)
RETURNS SMALLDATETIME
AS
BEGIN
DECLARE @FechaRetorno SMALLDATETIME
SELECT @FechaRetornoò.Fecha
FROM Fechas AS F1
JOIN Fechas AS F2
ON F1.Fecha<F2.Fecha
WHERE F1.Fecha BETWEEN @FechaInicio AND
DATEADD(day,(@NumeroDias*2)+10,@FechaInicio)
AND F2.Fecha BETWEEN @FechaInicio AND
DATEADD(day,(@NumeroDias*2)+10,@FechaInicio)
AND F1.EsLaboral=1 AND F2.EsLaboral=1
GROUP BY F2.Fecha
HAVING COUNT(*)=@NumeroDias
RETURN @FechaRetorno
END

GO
SELECT dbo.AgregaDiasLaborales('2004/01/17', 3)
== 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

"Julio" wrote in message
news:
Te lo agradecería Javier ya que tengo que poner la lista de los días
feriados de mi país, pero todavía aun no lo tenías resuelto ya que quería
resolver lo de los días de semana primero.

Si puede por favor me pasa el código completo con la tabla de días


feriados


"Javier Loria" wrote in message
news:%23MZ39f%
> Hola:
> Este es un viejo posteo, prueba a ver si te funciona:
> > > 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ÚTEADD(dd,-1,@FechaInicio)
> END
> IF (DATEPART(dw,@FechaFinal)=7)
> BEGIN
> SET @FechaFinalÚTEADD(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
> > > En mi opinion es mejor idea la tabla de Dias con la columna de


DiaHabil
> y luego hacer un COUNT de los que tengan DiaHabil en 1, esto es mas
> "extendible" ya que te permite incluir algunos dias no habiles feriados.
> Si
> es algo que te gustaria hacer puedo copiarte el codigo.
> 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
>
> "Julio" wrote in message
> news:
>> Saludos, Estuve realizando prueba con el código y observo que cuando la
>> fecha supera dos semana el solo asume un solo sábado y domingo.
>>
>> Es decir si yo hoy martes 16 / 2004 se digo que con diferencia de 10
>> días,
>> debería de caer el día 30 sin embargo trae la fecha del 28
>>
>>
>>
>> Es solo una observación, pero quería saber por si en el futuro se
>> presenta
>> algo como esto de tener que agregar más de 10 días
>>
>>
>>
>> Gracias
>>
>>
>>
>>
>> "ulises" wrote in message
>> news:0ea001c4cb52$3ffc1b60$
>> Te podría servir algo como :
>>
>> CREATE FUNCTION dbo.diamastres ( @fecha datetime )
>> RETURNS datetime
>> AS
>> BEGIN
>> DECLARE @diasemana int
>> DECLARE @fechamastres datetime
>> SET @diasemana = ( DATEPART(weekday,@fecha) + @@DATEFIRST -
>> 1 ) % 7
>> IF @diasemana + 3 >= 6
>> SET @fechamastres = DATEADD(day,5,@fecha)
>> ELSE
>> SET @fechamastres = DATEADD(day,3,@fecha)
>> RETURN(@fechamastres)
>> END
>>
>> pero no consistencia que el valor ingresado no sea un
>> sábado o domingo, si eso deseas deberás incluirlo.
>>
>> Saludos,
>> Ulises
>>
>> >Hola Grupo
>> >
>> >Como puedo a la fecha actual sumarle 3 dias sin contar los
>> fines de semana
>> >
>> >Select getdate() + 3 sin fin de semana
>> >
>> >
>> >.
>> >
>>
>>
>
>


Respuesta Responder a este mensaje
#9 Julio
17/11/2004 - 16:40 | Informe spam
Excelente Javier, gracias por tu maravillosa ayuda.

Algo que estuve probando es que el resultado es diferente cuando se ejecutan
de la siguiente manera:

SELECT dbo.AgregaDiasLaborales('2004/01/17', 3) = 2004-11-29 00:00:00
SELECT dbo.AgregaDiasLaborales(Getdate(), 8-1) = 2004-11-30 00:00:00

Siendo la fecha la del mismo dia
Lo que sucede es que la fecha que hoy a utilizar es Getdate()

Gracias




"Javier Loria" wrote in message
news:
Hola:
Tal vez algocomo esto:
==> CREATE TABLE Fechas(
Fecha SMALLDATETIME
NOT NULL PRIMARY KEY
CHECK(DATEPART(Hour,Fecha)=0 AND DATEPART(Minute,Fecha)=0)
, EsLaboral TINYINT
NOT NULL CHECK(EsLaboral IN (0,1))
DEFAULT 1
, EsFinSemana TINYINT
NOT NULL CHECK(EsFinSemana IN (0,1))
DEFAULT 0
)
INSERT Fechas(Fecha)
SELECT '2004/01/01' UNION ALL
SELECT '2004/01/02' UNION ALL
SELECT '2004/01/03' UNION ALL
SELECT '2004/01/04' UNION ALL
SELECT '2004/01/05'

INSERT Fechas(Fecha)
SELECT DATEADD(day, 5, Fecha) FROM Fechas UNION ALL
SELECT DATEADD(day, 10, Fecha) FROM Fechas UNION ALL
SELECT DATEADD(day, 15, Fecha) FROM Fechas UNION ALL
SELECT DATEADD(day, 20, Fecha) FROM Fechas

INSERT Fechas(Fecha)
SELECT DATEADD(day, 25, Fecha) FROM Fechas UNION ALL
SELECT DATEADD(day, 50, Fecha) FROM Fechas UNION ALL
SELECT DATEADD(day, 75, Fecha) FROM Fechas UNION ALL
SELECT DATEADD(day, 100, Fecha) FROM Fechas

INSERT Fechas(Fecha)
SELECT DATEADD(day, 125, Fecha) FROM Fechas UNION ALL
SELECT DATEADD(day, 250, Fecha) FROM Fechas WHERE DATEADD(day, 250,
Fecha)<'2005/01/01'

INSERT Fechas(Fecha)
SELECT DATEADD(day, 366, Fecha) FROM Fechas WHERE DATEADD(day, 366,
Fecha)<'2006/01/01'
UNION ALL
SELECT DATEADD(day, 731, Fecha) FROM Fechas WHERE DATEADD(day, 731,
Fecha)<'2007/01/01'
UNION ALL
SELECT DATEADD(day, 1096, Fecha) FROM Fechas WHERE DATEADD(day, 1096,
Fecha)<'2008/01/01'

INSERT Fechas(Fecha)
SELECT DATEADD(day, 1461, Fecha) FROM Fechas
UNION ALL
SELECT DATEADD(day, 2922, Fecha) FROM Fechas
UNION ALL
SELECT DATEADD(day, 4383, Fecha) FROM Fechas
UNION ALL
SELECT DATEADD(day, 5844, Fecha) FROM Fechas

UPDATE Fechas
SET EsLaboral=0
, EsFinSemana=1
FROM Fechas
WHERE DATEPART(dw, Fecha) IN (1,7)

UPDATE Fechas
SET EsLaboral=0
FROM Fechas
WHERE (DATEPART(Day,Fecha)=1 AND DATEPART(Month,Fecha)=1)
OR (DATEPART(Day,Fecha)% AND DATEPART(Month,Fecha))

GO
CREATE FUNCTION dbo.AgregaDiasLaborales(
@FechaInicio AS SMALLDATETIME
, @NumeroDias AS INTEGER)
RETURNS SMALLDATETIME
AS
BEGIN
DECLARE @FechaRetorno SMALLDATETIME
SELECT @FechaRetornoò.Fecha
FROM Fechas AS F1
JOIN Fechas AS F2
ON F1.Fecha<F2.Fecha
WHERE F1.Fecha BETWEEN @FechaInicio AND
DATEADD(day,(@NumeroDias*2)+10,@FechaInicio)
AND F2.Fecha BETWEEN @FechaInicio AND
DATEADD(day,(@NumeroDias*2)+10,@FechaInicio)
AND F1.EsLaboral=1 AND F2.EsLaboral=1
GROUP BY F2.Fecha
HAVING COUNT(*)=@NumeroDias
RETURN @FechaRetorno
END

GO
SELECT dbo.AgregaDiasLaborales('2004/01/17', 3)
==> 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

"Julio" wrote in message
news:
Te lo agradecería Javier ya que tengo que poner la lista de los días
feriados de mi país, pero todavía aun no lo tenías resuelto ya que quería
resolver lo de los días de semana primero.

Si puede por favor me pasa el código completo con la tabla de días


feriados


"Javier Loria" wrote in message
news:%23MZ39f%
> Hola:
> Este es un viejo posteo, prueba a ver si te funciona:
> >> > 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ÚTEADD(dd,-1,@FechaInicio)
> END
> IF (DATEPART(dw,@FechaFinal)=7)
> BEGIN
> SET @FechaFinalÚTEADD(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
> >> > En mi opinion es mejor idea la tabla de Dias con la columna de


DiaHabil
> y luego hacer un COUNT de los que tengan DiaHabil en 1, esto es mas
> "extendible" ya que te permite incluir algunos dias no habiles
> feriados.
> Si
> es algo que te gustaria hacer puedo copiarte el codigo.
> 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
>
> "Julio" wrote in message
> news:
>> Saludos, Estuve realizando prueba con el código y observo que cuando
>> la
>> fecha supera dos semana el solo asume un solo sábado y domingo.
>>
>> Es decir si yo hoy martes 16 / 2004 se digo que con diferencia de 10
>> días,
>> debería de caer el día 30 sin embargo trae la fecha del 28
>>
>>
>>
>> Es solo una observación, pero quería saber por si en el futuro se
>> presenta
>> algo como esto de tener que agregar más de 10 días
>>
>>
>>
>> Gracias
>>
>>
>>
>>
>> "ulises" wrote in message
>> news:0ea001c4cb52$3ffc1b60$
>> Te podría servir algo como :
>>
>> CREATE FUNCTION dbo.diamastres ( @fecha datetime )
>> RETURNS datetime
>> AS
>> BEGIN
>> DECLARE @diasemana int
>> DECLARE @fechamastres datetime
>> SET @diasemana = ( DATEPART(weekday,@fecha) + @@DATEFIRST -
>> 1 ) % 7
>> IF @diasemana + 3 >= 6
>> SET @fechamastres = DATEADD(day,5,@fecha)
>> ELSE
>> SET @fechamastres = DATEADD(day,3,@fecha)
>> RETURN(@fechamastres)
>> END
>>
>> pero no consistencia que el valor ingresado no sea un
>> sábado o domingo, si eso deseas deberás incluirlo.
>>
>> Saludos,
>> Ulises
>>
>> >Hola Grupo
>> >
>> >Como puedo a la fecha actual sumarle 3 dias sin contar los
>> fines de semana
>> >
>> >Select getdate() + 3 sin fin de semana
>> >
>> >
>> >.
>> >
>>
>>
>
>






Respuesta Responder a este mensaje
#10 Julio
17/11/2004 - 17:22 | Informe spam
En el anterior pase las los dias mal

SELECT dbo.AgregaDiasLaborales('2004/01/17', 3) = 2004-11-29 00:00:00
SELECT dbo.AgregaDiasLaborales(Getdate(), 3) = 2004-11-30 00:00:00



"Julio" wrote in message
news:
Excelente Javier, gracias por tu maravillosa ayuda.

Algo que estuve probando es que el resultado es diferente cuando se
ejecutan de la siguiente manera:

SELECT dbo.AgregaDiasLaborales('2004/01/17', 3) = 2004-11-29 00:00:00
SELECT dbo.AgregaDiasLaborales(Getdate(), 8-1) = 2004-11-30 00:00:00

Siendo la fecha la del mismo dia
Lo que sucede es que la fecha que hoy a utilizar es Getdate()

Gracias




"Javier Loria" wrote in message
news:
Hola:
Tal vez algocomo esto:
==>> CREATE TABLE Fechas(
Fecha SMALLDATETIME
NOT NULL PRIMARY KEY
CHECK(DATEPART(Hour,Fecha)=0 AND DATEPART(Minute,Fecha)=0)
, EsLaboral TINYINT
NOT NULL CHECK(EsLaboral IN (0,1))
DEFAULT 1
, EsFinSemana TINYINT
NOT NULL CHECK(EsFinSemana IN (0,1))
DEFAULT 0
)
INSERT Fechas(Fecha)
SELECT '2004/01/01' UNION ALL
SELECT '2004/01/02' UNION ALL
SELECT '2004/01/03' UNION ALL
SELECT '2004/01/04' UNION ALL
SELECT '2004/01/05'

INSERT Fechas(Fecha)
SELECT DATEADD(day, 5, Fecha) FROM Fechas UNION ALL
SELECT DATEADD(day, 10, Fecha) FROM Fechas UNION ALL
SELECT DATEADD(day, 15, Fecha) FROM Fechas UNION ALL
SELECT DATEADD(day, 20, Fecha) FROM Fechas

INSERT Fechas(Fecha)
SELECT DATEADD(day, 25, Fecha) FROM Fechas UNION ALL
SELECT DATEADD(day, 50, Fecha) FROM Fechas UNION ALL
SELECT DATEADD(day, 75, Fecha) FROM Fechas UNION ALL
SELECT DATEADD(day, 100, Fecha) FROM Fechas

INSERT Fechas(Fecha)
SELECT DATEADD(day, 125, Fecha) FROM Fechas UNION ALL
SELECT DATEADD(day, 250, Fecha) FROM Fechas WHERE DATEADD(day, 250,
Fecha)<'2005/01/01'

INSERT Fechas(Fecha)
SELECT DATEADD(day, 366, Fecha) FROM Fechas WHERE DATEADD(day, 366,
Fecha)<'2006/01/01'
UNION ALL
SELECT DATEADD(day, 731, Fecha) FROM Fechas WHERE DATEADD(day, 731,
Fecha)<'2007/01/01'
UNION ALL
SELECT DATEADD(day, 1096, Fecha) FROM Fechas WHERE DATEADD(day, 1096,
Fecha)<'2008/01/01'

INSERT Fechas(Fecha)
SELECT DATEADD(day, 1461, Fecha) FROM Fechas
UNION ALL
SELECT DATEADD(day, 2922, Fecha) FROM Fechas
UNION ALL
SELECT DATEADD(day, 4383, Fecha) FROM Fechas
UNION ALL
SELECT DATEADD(day, 5844, Fecha) FROM Fechas

UPDATE Fechas
SET EsLaboral=0
, EsFinSemana=1
FROM Fechas
WHERE DATEPART(dw, Fecha) IN (1,7)

UPDATE Fechas
SET EsLaboral=0
FROM Fechas
WHERE (DATEPART(Day,Fecha)=1 AND DATEPART(Month,Fecha)=1)
OR (DATEPART(Day,Fecha)% AND DATEPART(Month,Fecha))

GO
CREATE FUNCTION dbo.AgregaDiasLaborales(
@FechaInicio AS SMALLDATETIME
, @NumeroDias AS INTEGER)
RETURNS SMALLDATETIME
AS
BEGIN
DECLARE @FechaRetorno SMALLDATETIME
SELECT @FechaRetornoò.Fecha
FROM Fechas AS F1
JOIN Fechas AS F2
ON F1.Fecha<F2.Fecha
WHERE F1.Fecha BETWEEN @FechaInicio AND
DATEADD(day,(@NumeroDias*2)+10,@FechaInicio)
AND F2.Fecha BETWEEN @FechaInicio AND
DATEADD(day,(@NumeroDias*2)+10,@FechaInicio)
AND F1.EsLaboral=1 AND F2.EsLaboral=1
GROUP BY F2.Fecha
HAVING COUNT(*)=@NumeroDias
RETURN @FechaRetorno
END

GO
SELECT dbo.AgregaDiasLaborales('2004/01/17', 3)
==>> 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

"Julio" wrote in message
news:
Te lo agradecería Javier ya que tengo que poner la lista de los días
feriados de mi país, pero todavía aun no lo tenías resuelto ya que
quería
resolver lo de los días de semana primero.

Si puede por favor me pasa el código completo con la tabla de días


feriados


"Javier Loria" wrote in message
news:%23MZ39f%
> Hola:
> Este es un viejo posteo, prueba a ver si te funciona:
> >>> > 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ÚTEADD(dd,-1,@FechaInicio)
> END
> IF (DATEPART(dw,@FechaFinal)=7)
> BEGIN
> SET @FechaFinalÚTEADD(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
> >>> > En mi opinion es mejor idea la tabla de Dias con la columna de


DiaHabil
> y luego hacer un COUNT de los que tengan DiaHabil en 1, esto es mas
> "extendible" ya que te permite incluir algunos dias no habiles
> feriados.
> Si
> es algo que te gustaria hacer puedo copiarte el codigo.
> 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
>
> "Julio" wrote in message
> news:
>> Saludos, Estuve realizando prueba con el código y observo que cuando
>> la
>> fecha supera dos semana el solo asume un solo sábado y domingo.
>>
>> Es decir si yo hoy martes 16 / 2004 se digo que con diferencia de 10
>> días,
>> debería de caer el día 30 sin embargo trae la fecha del 28
>>
>>
>>
>> Es solo una observación, pero quería saber por si en el futuro se
>> presenta
>> algo como esto de tener que agregar más de 10 días
>>
>>
>>
>> Gracias
>>
>>
>>
>>
>> "ulises" wrote in message
>> news:0ea001c4cb52$3ffc1b60$
>> Te podría servir algo como :
>>
>> CREATE FUNCTION dbo.diamastres ( @fecha datetime )
>> RETURNS datetime
>> AS
>> BEGIN
>> DECLARE @diasemana int
>> DECLARE @fechamastres datetime
>> SET @diasemana = ( DATEPART(weekday,@fecha) + @@DATEFIRST -
>> 1 ) % 7
>> IF @diasemana + 3 >= 6
>> SET @fechamastres = DATEADD(day,5,@fecha)
>> ELSE
>> SET @fechamastres = DATEADD(day,3,@fecha)
>> RETURN(@fechamastres)
>> END
>>
>> pero no consistencia que el valor ingresado no sea un
>> sábado o domingo, si eso deseas deberás incluirlo.
>>
>> Saludos,
>> Ulises
>>
>> >Hola Grupo
>> >
>> >Como puedo a la fecha actual sumarle 3 dias sin contar los
>> fines de semana
>> >
>> >Select getdate() + 3 sin fin de semana
>> >
>> >
>> >.
>> >
>>
>>
>
>










Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente AnteriorRespuesta Tengo una respuesta
Search Busqueda sugerida