Era viernes y ya es sábado

14/06/2008 - 01:18 por David | Informe spam
Microsoft SQL Server 200


Muy buenas, llevo horas y ya ha pasado el viernes y estamos a sábado (que
pesadilla)

¿Cómo insertar fechas que sean VIERNES o SÁBADOS, dado un periodo definido
por FechaInicial y FechaFinal?

Dadas dos fechas: FechaInicio y FechaFinal que definen un periodo insertas
las fechas que sean Viernes o Sábados



INSERT INTO festivos

(fecha)

VALUES

NI IDEA

where
datediff(dd,FechaInicial,FechaFinal) > 4 or
(datepart(dw,FechaInicial)+@@datefirst)%7 >
(datepart(dw,FechaFinal)+@@datefirst)%7 or
(datepart(dw,FechaInicial)+@@datefirst)%7 = 0 or
(datepart(dw,FechaFinal)+@@datefirst)%7 = 6

Reconozco que no se por donde tirar, la condición de VIERNES o SÁBADO está
ahí pero ¿Cómo insertar las puñeteras fechas?

En fin cualquier aportación será bienvenida.

Preguntas similare

Leer las respuestas

#6 Geovanny Quirós C.
16/06/2008 - 22:29 | Informe spam
Amigos pensando..pensando, se me ocurrio que el problema de David se podia
resolver con un codigo muy simple, Maxi me dió la idea cuando menciono lo de
usar un Ciclo While.
Con esto se soluciona el problema de David, pero me gustaría saber si esta
es la mejor solucion (claro está esto deberia ser un SP que reciba de
parametros las dos fechas). Sería interesante leer opiniones de los mas
conocedores.

Pude haber prescindido de las varibles FechaActual y CantidadDias pero lo
dejé asi para que se vea un poco mas limpio el codigo.

Saludos


DECLARE @FechaInicio DATETIME
DECLARE @FechaFin DATETIME
DECLARE @FechaActual DATETIME
DECLARE @Contador INT
DECLARE @CantidadDias INT

SET @FechaInicio = '20080601'
SET @FechaFin = '20080630'
SET @FechaActual=@FechaInicio
SET @contador = 0
SET @CantidadDias = DATEDIFF(day, @fechaInicio, @FechaFin)

WHILE @Contador <= @CantidadDias
BEGIN
SET @fechaActual = DATEADD(day, @contador, @FechaInicio)
SET @Contador=@contador+1
IF DATEPART(dw, @fechaActual) in (6,7)
PRINT @FechaActual -- es un viernes ó sabado aquí deberia poner su codigo
de interes
CONTINUE
END

________________

Geovanny Quirós C.
Heredia, Costa Rica


"David" escribió en el mensaje de
noticias:
Microsoft SQL Server 200


Muy buenas, llevo horas y ya ha pasado el viernes y estamos a sábado (que
pesadilla)

¿Cómo insertar fechas que sean VIERNES o SÁBADOS, dado un periodo definido
por FechaInicial y FechaFinal?

Dadas dos fechas: FechaInicio y FechaFinal que definen un periodo insertas
las fechas que sean Viernes o Sábados



INSERT INTO festivos

(fecha)

VALUES

NI IDEA

where
datediff(dd,FechaInicial,FechaFinal) > 4 or
(datepart(dw,FechaInicial)+@@datefirst)%7 >
(datepart(dw,FechaFinal)+@@datefirst)%7 or
(datepart(dw,FechaInicial)+@@datefirst)%7 = 0 or
(datepart(dw,FechaFinal)+@@datefirst)%7 = 6

Reconozco que no se por donde tirar, la condición de VIERNES o SÁBADO está
ahí pero ¿Cómo insertar las puñeteras fechas?

En fin cualquier aportación será bienvenida.




Respuesta Responder a este mensaje
#7 Carlos M. Calvelo
17/06/2008 - 02:21 | Informe spam
Hola Geovanny,

On 16 jun, 22:29, Geovanny Quirós C.
wrote:
Amigos pensando..pensando, se me ocurrio que el problema de David se podia
resolver con un codigo muy simple, Maxi me dió la idea cuando menciono lo de
usar un Ciclo While.
Con esto se soluciona el problema de David, pero me gustaría saber si esta
es la mejor solucion (claro está esto deberia ser un SP que reciba de
parametros las dos fechas). Sería interesante leer opiniones de los mas
conocedores.



Has visto el link que le he puse a David, donde he dejado ya hace
una temporada una función Fechas()?
Lo que tu propones es muy parecido, pero para mi gusto están muy
acopladas dos partes del problema: 1) generación de un conjunto de
fechas y 2) para qué se quieren utilizar esas fechas.

La generación del conjunto de fechas es la parte genérica. Separando
esta parte se puede simplificar mucho el problema cuando queremos
utilizar esas fechas con distintos fines y en contextos muy diversos.

IF DATEPART(dw, @fechaActual) in (6,7)
PRINT @FechaActual -- es un viernes ó sabado aquí deberia poner su codigo
de interes



Con este IF y tu comentario te estás refiriendo a la parte
específica del problema. Y ese código está muy acoplado al
bucle, que es la parte genérica.

Entonces me gusta mas como he propuesto yo: una función genérica que
puede generar cualquier rango de fechas y que se puede utilizar en
muchos contextos. Por ejemplo para seleccionar los viernes y los
sábados de David:

select *
from dbo.Fechas(@fechainicial,@fechafinal)
where diasemana in (0,6)

O para selecionar otros días de la semana.

O para generar una tabla 'calendario':

insert into calendario (fecha, diasemana)
select fecha,diasemana from dbo.Fechas('20000101','20201231')

Que a su vez se puede utilizar en otras consultas evitando así
el uso repetitivo de la función que estaría quizás generando una
y otra vez la misma tabla.

Etc, etc. Seguro que tu puedes imaginarte un par de ejemplos mas :)

En fin, con este desacoplamiento consigues que la función Fechas()
se pueda utilizar para otros fines sin tener escribir cada vez el
mismo bucle para cada problema específico.

En el link que he dejado está también una función Numbers()
Esta función también podría ser una tabla. Mira el ejemplo que
pongo allí para generar un rango de fechas con esa función.
La idea es la misma: evitar tener que programar una y otra vez
el mismo tipo de bucle cuando aparecen este tipo de problemas.

Por poner otro ejemplo:
Imagínate que tienes una fecha inicial a partir de la cual se tienen
que hace x pagos mensuales y necesitas generar registros que
representan estos pagos. Entonces no hace falta ponerse a programar
bucles. Simplemente se hace un cross join de la tabla con la
fecha inicial y el numero de mensualidades con la tabla
dbo.Numbers(...) y se generan así todas las fechas de pago (fecha
inicial + Number(de meses))

Bueno.. espero que se entienda que la idea es 'atrapar' cierta
generalidad que aparece en muchos problemas, en forma de una
tabla o función (en este caso estas funciones son tablas), para
así ahorrarse trabajo con los problema específicos. En estos
problemas específicos se usa una función como una tabla
aplicando join's con otras tablas, where's, selects, etc.
Evitando así también un SP específico para cada problema.

Una forma de dicir lo anterior de una forma mucho mas general:
Problemas genéricos para los que no podemos encontar una solución
con programación declarativa podemos solucionarlos procedimental-
mente. Pero mejor hacerlo de tal forma que eso nos dé una base
para solucionar problemas específicos declarativamente.

Supongo que todo programador con un poco de experiencia conoce
ese sentir que tenemos a veces de que lo que estamos programando
es muy parecido a lo que ya hemos hecho muchas veces y que solo
algunos 'detalles' son distintos.

Saludos,
Carlos
Respuesta Responder a este mensaje
#8 Geovanny Quirós C.
17/06/2008 - 16:12 | Informe spam
Excelente Carlos, en realidad se me despertó la curiosidad por el problema
particular de David, - la necesidad era de él no mia - y decidí buscar una
manera de resolver el problema sin tener que crear una tabla y cargarla con
las fechas de un rango dado.

Voy a estudiar las funciones que mencionas, todos los días aprendemos cosas
nuevas.

Saludos y gracias por sus comentarios.




________________

Geovanny Quirós C.
Heredia, Costa Rica


"Carlos M. Calvelo" escribió en el mensaje de
noticias:
Hola Geovanny,

On 16 jun, 22:29, Geovanny Quirós C.
wrote:
Amigos pensando..pensando, se me ocurrio que el problema de David se
podia
resolver con un codigo muy simple, Maxi me dió la idea cuando menciono lo
de
usar un Ciclo While.
Con esto se soluciona el problema de David, pero me gustaría saber si
esta
es la mejor solucion (claro está esto deberia ser un SP que reciba de
parametros las dos fechas). Sería interesante leer opiniones de los mas
conocedores.



Has visto el link que le he puse a David, donde he dejado ya hace
una temporada una función Fechas()?
Lo que tu propones es muy parecido, pero para mi gusto están muy
acopladas dos partes del problema: 1) generación de un conjunto de
fechas y 2) para qué se quieren utilizar esas fechas.

La generación del conjunto de fechas es la parte genérica. Separando
esta parte se puede simplificar mucho el problema cuando queremos
utilizar esas fechas con distintos fines y en contextos muy diversos.

IF DATEPART(dw, @fechaActual) in (6,7)
PRINT @FechaActual -- es un viernes ó sabado aquí
deberia poner su codigo
de interes



Con este IF y tu comentario te estás refiriendo a la parte
específica del problema. Y ese código está muy acoplado al
bucle, que es la parte genérica.

Entonces me gusta mas como he propuesto yo: una función genérica que
puede generar cualquier rango de fechas y que se puede utilizar en
muchos contextos. Por ejemplo para seleccionar los viernes y los
sábados de David:

select *
from dbo.Fechas(@fechainicial,@fechafinal)
where diasemana in (0,6)

O para selecionar otros días de la semana.

O para generar una tabla 'calendario':

insert into calendario (fecha, diasemana)
select fecha,diasemana from dbo.Fechas('20000101','20201231')

Que a su vez se puede utilizar en otras consultas evitando así
el uso repetitivo de la función que estaría quizás generando una
y otra vez la misma tabla.

Etc, etc. Seguro que tu puedes imaginarte un par de ejemplos mas :)

En fin, con este desacoplamiento consigues que la función Fechas()
se pueda utilizar para otros fines sin tener escribir cada vez el
mismo bucle para cada problema específico.

En el link que he dejado está también una función Numbers()
Esta función también podría ser una tabla. Mira el ejemplo que
pongo allí para generar un rango de fechas con esa función.
La idea es la misma: evitar tener que programar una y otra vez
el mismo tipo de bucle cuando aparecen este tipo de problemas.

Por poner otro ejemplo:
Imagínate que tienes una fecha inicial a partir de la cual se tienen
que hace x pagos mensuales y necesitas generar registros que
representan estos pagos. Entonces no hace falta ponerse a programar
bucles. Simplemente se hace un cross join de la tabla con la
fecha inicial y el numero de mensualidades con la tabla
dbo.Numbers(...) y se generan así todas las fechas de pago (fecha
inicial + Number(de meses))

Bueno.. espero que se entienda que la idea es 'atrapar' cierta
generalidad que aparece en muchos problemas, en forma de una
tabla o función (en este caso estas funciones son tablas), para
así ahorrarse trabajo con los problema específicos. En estos
problemas específicos se usa una función como una tabla
aplicando join's con otras tablas, where's, selects, etc.
Evitando así también un SP específico para cada problema.

Una forma de dicir lo anterior de una forma mucho mas general:
Problemas genéricos para los que no podemos encontar una solución
con programación declarativa podemos solucionarlos procedimental-
mente. Pero mejor hacerlo de tal forma que eso nos dé una base
para solucionar problemas específicos declarativamente.

Supongo que todo programador con un poco de experiencia conoce
ese sentir que tenemos a veces de que lo que estamos programando
es muy parecido a lo que ya hemos hecho muchas veces y que solo
algunos 'detalles' son distintos.

Saludos,
Carlos
Respuesta Responder a este mensaje
#9 Carlos M. Calvelo
17/06/2008 - 17:12 | Informe spam
Hola Geovanny,

On Jun 17, 4:12 pm, Geovanny Quirós C.
wrote:

Voy a estudiar las funciones que mencionas, ...



Bueno... esas funciones no tienen nada del otro mundo. Son
de lo más simple que te puedas imaginar.

Lo importante es que son reutilizables para muchas cosas
y te ayudan a no tener que programar tanto una y otra vez.
Y no tienen por qué ser funciones. Unas tablas 'Numeros',
'Fechas', 'Calendario', etc. te sacan de los mismos apuros.

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