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

#11 Javier Loria
17/11/2004 - 18:18 | Informe spam
Hola:
La funcion "asume" que se le pasa una fecha entera, por la forma en que
esta construido el BETWEEN, podrias "redondear" la fecha, haciendo una
conversion previa de @FechaInicio. Agrega una linea como esta:
SET @FechaInicio=CONVERT(SMALLDATETIME,
CONVERT(VARCHAR(10),@FechaInicio,102))

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:
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
#12 Julio
17/11/2004 - 18:19 | Informe spam
Ok Javier, gracias de nuevo
"Javier Loria" wrote in message
news:
Hola:
La funcion "asume" que se le pasa una fecha entera, por la forma en que
esta construido el BETWEEN, podrias "redondear" la fecha, haciendo una
conversion previa de @FechaInicio. Agrega una linea como esta:
SET @FechaInicio=CONVERT(SMALLDATETIME,
CONVERT(VARCHAR(10),@FechaInicio,102))

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:
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
#13 Julio
25/11/2004 - 22:14 | Informe spam
En caso que fueran 7 dias como deberia expresarlo
"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


.

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