none
VISUALIZAR TODAS LAS FECHAS DENTRO DE UN RANGO DE FECHAS RRS feed

  • Pregunta

  • BUENO ME EXPLICO :

    TENGO 2 FECHAS POR EJEMPLO     FECHA INICIAL 01/02/2011 FECHA FINAL 10/02/2011

    Y LOS DATOS ESPERADOS SON :

    01/02/2011

    02/02/2011

    03/02/2011

    04/02/2011

    05/02/2011

    06/02/2011

    07/02/2011

    08/02/2011

    09/02/2011

    10/02/2011

    TAMBIEN  OTRA CONSULTA MAS

    TENGO 2 FECHAS POR EJEMPLO     FECHA INICIAL 01/02/2011 FECHA FINAL 20/02/2011

    Y SOLO QUIERO LOS DIAS LUNES DE ESA FECHA

    RESULTADO:

    07/02/2011

    14/02/2011

    PERO ALGO MAS AMIGOS QUISIERA QUE LA FECHAS SE ME MUESTREN COMO COLUMNA DE TABLA Y COMO REGISTRO DE MI TABLA BUENO Saludos amigos

     


    maicol8k
    jueves, 10 de febrero de 2011 2:54

Respuestas

  • Hola.

    No sé qué has intentado porque eso sigue siendo exactamente lo mismo que está publicado en mi blog, sin aplicar el filtro del día de la semana ni cambiar los rangos de fecha, como te he ido diciendo, pero en fin. Te lo pongo igualmente:

    declare
    @fec_inicio DateTime,
    @fec_fin DateTime
    --Supongamos que quiero la primera quincena de Febrero
    select @fec_inicio = '20110201', @fec_fin = '20110215'
    ;WITH FECHAS(fecha) AS (
    SELECT @fec_inicio fecha
    UNION ALL
    SELECT DATEADD(day, 1, fecha) fecha
    FROM FECHAS
    WHERE fecha < @fec_fin
    )
    select fecha from FECHAS 
    where datepart(dw, fecha) = 5
    OPTION (MaxRecursion 0)
    

    Si no lo logras, nos dices.


    Alberto López Grande
    SQL Server MVP
    Visita mi blog en http://qwalgrande.blogspot.es/

    jueves, 10 de febrero de 2011 20:41
    Moderador
  • hola, lo q puedes usar es validar por le nombre del dia, en tu where algo como:

    AND DATENAME(dw,Fecha) = 'Lunes'

    AND DATENAME(dw,Fecha) = 'Miercoles' .. etc


    Julio Avellaneda
    Blog !!

    • Marcado como respuesta ApreSabi jueves, 10 de febrero de 2011 20:50
    jueves, 10 de febrero de 2011 20:32
  • Hola.

    Por favor, presta atención al formato en el que expones tus preguntas porque tal y como los dejas es mucho más difícil interpretar lo que dices. Es muy tedioso tener que estar corrigiendo una y otra vez lo que pones para que alguien pueda echarte una mano. Si vas a meter un ejemplo de código, utiliza la funcionalidad para ello (el último botón de la barra).

    Yendo a tu cuestión, el problema está en que pretendes ejecutar más de una sentencia tras definir la CTE. Tendrías que incluir la condición en la propia consulta o declarar dos veces las CTE.

     

    declare @fec_inicio DateTime, @fec_fin DateTime, @condicion int
    
    select 
     @fec_inicio = '2011/02/01', 
     @fec_fin = '2011/10/01',
     @condicion=2
    
    if @condicion=1
     begin
     ;WITH FECHAS(fecha) AS (
     SELECT @fec_inicio fecha
     UNION ALL
     SELECT DATEADD(day, 1, fecha) fecha
     FROM FECHAS
     WHERE fecha < @fec_fin
     )
     select
     fecha 
     from FECHAS
     where
     datepart(dw, fecha) = 1 or 
     datepart(dw, fecha)=3 or 
     datepart(dw, fecha)=5
     OPTION (MaxRecursion 0)
     end
    else if @condicion=2
     begin
     ;WITH FECHAS(fecha) AS (
     SELECT @fec_inicio fecha
     UNION ALL
     SELECT DATEADD(day, 1, fecha) fecha
     FROM FECHAS
     WHERE fecha < @fec_fin
     )
     select
     fecha
     from FECHAS
     where
     datepart(dw, fecha)=5
     OPTION (MaxRecursion 0)
     end
    

     

    Si no lo logras, nos dices.


    Alberto López Grande
    SQL Server MVP
    Visita mi blog en http://qwalgrande.blogspot.es/

    martes, 15 de febrero de 2011 22:06
    Moderador

Todas las respuestas

  • Hola.

    Para las dos primeras cuestiones, encontrarás de mucha utilidad el siguiente link:

    http://qwalgrande.blogspot.es/1255098540/me-gustan-las-ctes-(tabla-de-dias)/

    En cuanto a la tercera cuestión, que las fechas aparezcan como registros es simple (es lo que ya hemos comentado). Que aparezcan como columnas, ya depende. ¿Qué es lo que pretendes hacer? A lo mejor estamos refiriéndonos a una cuestión de la capa de presentación.


    Alberto López Grande
    SQL Server MVP
    Visita mi blog en http://qwalgrande.blogspot.es/

    jueves, 10 de febrero de 2011 8:15
    Moderador
  • No está nada claro lo que quieres hacer. Entiendo que las fechas no están en una tabla, ya que en ese caso sería trivial obtenerlas mediante un "select...where fecha between inicio and fin", y separar los lunes se podría hacer con un "... and datepart(...)=...". Para obtenerlas como columna en lugar de fila se podría usar la instrucción PIVOT.

    Entonces, si las fechas no están en una tabla, presumo que lo que quieres es crear un "generador de fechas" al que le pases el rango y las vaya construyendo. Se podría hacer dentro de una función multilínea del tipo "returns table", con un bucle que las construya por código. Pero antes de lanzarse a hacerlo convendría plantearse si realmente este es el camino adecuado, ya que lo más normal en una aplicación "ordinaria" es que este tipo de cosas las haga el código cliente, no el servidor SQL. ¿Cuál es el propósito que pretendes conseguir al construir este tipo de tabla dinámicamente en el servidor?

     

    jueves, 10 de febrero de 2011 8:18
  • muy bueno excelente .... pero aun no logro enlazar que solo me aparescan fechas que pertenenecen al dia viernes :

    lo que pasa es que yo voy a seleccionar 2 fechas (rangos fechas ) y ademas voy a decir  que de dento de ese rango quiero la fechas de los dias ", lunes , miercoles, viernes"   o dependiendo que eliga el usuario  puede que eliga otra conbinacion de dias ....

    ahora lo que pasa es que yo al consultar esa fecha quiero que se me muestren en una grilla  pero como la consulta en registros  pues se mostraran como tal en la grilla , ahora si yo hiciera que esa consulta en ves de registros sean columnas pues me seria mas util .......  ahora bien yo lo puedo hacer por programacion ... pero quisiera que los datos porvengan ya desde sql ("ahora la pregunta es ¿tu crees que esta bien que lo convierta en columna desde la consulta en sql o que lo haga ya el el codigo de programacion?")


    maicol8k
    jueves, 10 de febrero de 2011 14:14
  • alberto poblacion: te contesto

    ¿Cuál es el propósito que pretendes conseguir al construir este tipo de tabla dinámicamente en el servidor? pues solo quiero que la consulta me genere ya columnas dento de un grilla , claro esto lo puedo hacer en el codigo de programacion ... pero bueno .... como me lo dices .. eso seria un error ... pero quisiera hacer pruebas ... estoy haciendo el asp.net  bueno gracias por la respuesta

     


    maicol8k
    jueves, 10 de febrero de 2011 14:21
  • Hola.

    Filtrar un día de la semana es trivial, basta con usar la función datepart:

     

    --ejemplo: hoy es jueves, día cuatro
    set datefirst 1
    select datepart(dw, getdate())
    
    -- para filtrar los viernes:
    set datefirst 1
    ...
    select ...
    from...
    where datepart(dw, MiCampoFecha) = 5
    
    

     

    El otro punto es una cuestión de representación gráfica, la consulta debe ser la misma.


    Alberto López Grande
    SQL Server MVP
    Visita mi blog en http://qwalgrande.blogspot.es/

    jueves, 10 de febrero de 2011 14:24
    Moderador
  •   

    declare

    @fec_inicio DateTime,

    @fec_fin DateTime

    select @fec_inicio = '20091001', @fec_fin = '20091031'

    ;WITH FECHAS(fecha) AS (

    SELECT @fec_inicio fecha

    UNION ALL

    SELECT DATEADD(day, 1, fecha) fecha

    FROM FECHAS

    WHERE fecha < @fec_fin

    )

    select fecha from FECHAS

    OPTION (MaxRecursion 0);

     

    alberto lopez grande bueno tu ejemplo fue excelente.... pero despues me distes  para filtar los dias y si filtra pero quiero unir la dos consulta y es ahi donde no puedo realizarlo (osea con el ejemplo de tu blog  quiero esta otro ejemplo que me diste se unan  y asi poder obtener las fechas de los dias lunes miercoles y viernes ) ahora este ultimo ejemplo me devuelve entero y quiero q me devuelva fechas ...

    set datefirst 1
    select datepart(dw, getdate())

    -- para filtrar los viernes:
    set datefirst 1
    ...
    select ...
    from...
    where datepart(dw, MiCampoFecha) = 5

    bueno amigo disculpa por ser tan pregunton pero la verdad aun no puedo llegar al resultado requerido

    TENGO 2 FECHAS POR EJEMPLO     FECHA INICIAL 01/02/2011 FECHA FINAL 20/02/2011

    Y SOLO QUIERO LOS DIAS LUNES DE ESA FECHA

    RESULTADO:

    07/02/2011

    14/02/2011

    saludos y disculpa la molestia .....

    nota:¿no se en que estaba pensando y me inscribi en el evento que se va a realizar y pues no podre ir... como podria hacer para eliminarme de la lista de asistencia de evento ? 


     


    maicol8k
    jueves, 10 de febrero de 2011 15:21
  • Hola.

    Sólo has de añadir esos filtros adicionales a tu consulta o en la cte, partir de esa fecha inicial y final:

    -- Pon tu fecha inicial y final aquí
    select @fec_inicio = '20091001', @fec_fin = '20091031'
    
    Sobre lo del evento, no sé, supongo que si intentar volver a inscribirte, te dirá que ya estás inscrito y te llevará a algún tipo de agenda en la que podrás rechazar la inscripción.


    Alberto López Grande
    SQL Server MVP
    Visita mi blog en http://qwalgrande.blogspot.es/

    jueves, 10 de febrero de 2011 17:42
    Moderador
  •  

    declare

    @fec_inicio DateTime,

    @fec_fin DateTime

    select @fec_inicio = '20091001', @fec_fin = '20091031'

    ;WITH FECHAS(fecha) AS (

    SELECT @fec_inicio fecha

    UNION ALL

    SELECT DATEADD(day, 1, fecha) fecha

    FROM FECHAS

    WHERE fecha < @fec_fin

    )

    select fecha from FECHAS

    OPTION (MaxRecursion 0

     

     

    bueno amigo alberto lopez grande la verdad lo intente pero hasta ahora no me resulta ("solo quiero los dias lunes, miercoles y viernes dentro de ese"rango") bueno segurire intentando gracias por todo un saludo ....


    maicol8k
    jueves, 10 de febrero de 2011 19:17
  • hola, lo q puedes usar es validar por le nombre del dia, en tu where algo como:

    AND DATENAME(dw,Fecha) = 'Lunes'

    AND DATENAME(dw,Fecha) = 'Miercoles' .. etc


    Julio Avellaneda
    Blog !!

    • Marcado como respuesta ApreSabi jueves, 10 de febrero de 2011 20:50
    jueves, 10 de febrero de 2011 20:32
  • Hola.

    No sé qué has intentado porque eso sigue siendo exactamente lo mismo que está publicado en mi blog, sin aplicar el filtro del día de la semana ni cambiar los rangos de fecha, como te he ido diciendo, pero en fin. Te lo pongo igualmente:

    declare
    @fec_inicio DateTime,
    @fec_fin DateTime
    --Supongamos que quiero la primera quincena de Febrero
    select @fec_inicio = '20110201', @fec_fin = '20110215'
    ;WITH FECHAS(fecha) AS (
    SELECT @fec_inicio fecha
    UNION ALL
    SELECT DATEADD(day, 1, fecha) fecha
    FROM FECHAS
    WHERE fecha < @fec_fin
    )
    select fecha from FECHAS 
    where datepart(dw, fecha) = 5
    OPTION (MaxRecursion 0)
    

    Si no lo logras, nos dices.


    Alberto López Grande
    SQL Server MVP
    Visita mi blog en http://qwalgrande.blogspot.es/

    jueves, 10 de febrero de 2011 20:41
    Moderador
  • Hola.

    Por favor, presta atención al formato en el que expones tus preguntas porque tal y como los dejas es mucho más difícil interpretar lo que dices. Es muy tedioso tener que estar corrigiendo una y otra vez lo que pones para que alguien pueda echarte una mano. Si vas a meter un ejemplo de código, utiliza la funcionalidad para ello (el último botón de la barra).

    Yendo a tu cuestión, el problema está en que pretendes ejecutar más de una sentencia tras definir la CTE. Tendrías que incluir la condición en la propia consulta o declarar dos veces las CTE.

     

    declare @fec_inicio DateTime, @fec_fin DateTime, @condicion int
    
    select 
     @fec_inicio = '2011/02/01', 
     @fec_fin = '2011/10/01',
     @condicion=2
    
    if @condicion=1
     begin
     ;WITH FECHAS(fecha) AS (
     SELECT @fec_inicio fecha
     UNION ALL
     SELECT DATEADD(day, 1, fecha) fecha
     FROM FECHAS
     WHERE fecha < @fec_fin
     )
     select
     fecha 
     from FECHAS
     where
     datepart(dw, fecha) = 1 or 
     datepart(dw, fecha)=3 or 
     datepart(dw, fecha)=5
     OPTION (MaxRecursion 0)
     end
    else if @condicion=2
     begin
     ;WITH FECHAS(fecha) AS (
     SELECT @fec_inicio fecha
     UNION ALL
     SELECT DATEADD(day, 1, fecha) fecha
     FROM FECHAS
     WHERE fecha < @fec_fin
     )
     select
     fecha
     from FECHAS
     where
     datepart(dw, fecha)=5
     OPTION (MaxRecursion 0)
     end
    

     

    Si no lo logras, nos dices.


    Alberto López Grande
    SQL Server MVP
    Visita mi blog en http://qwalgrande.blogspot.es/

    martes, 15 de febrero de 2011 22:06
    Moderador
  • ok disculpe usted por el formato .. muchas gracias .. aunque en su respuesta le falta un parentesis en el  OPTION MaxRecursion 0) a ver si lo edita ... bueno gracias por todo alberto lopez

    maicol8k
    martes, 15 de febrero de 2011 22:22
  • Hola muchachos tengo un problema similar y me estoy volviendo como loco a ver si me pueden ayudar

    resulta que tengo esta tabla y como pueden ver deseo hacer un procedimiento que me guarde en una tabla temporal todos estos datos pero la particularidad es que me inserte los datos diarios que suceden por dias, una actividad comienza un día y termina otro, registrando el tiempo en que sucede, lo que quiero es que me cree tabla de duracion de actividades diarias y me agregue el resto en dias posteriores con la misma actividad.

    porfa alguna idea


    LLEGADA A CARGAR 2 8/10/2018 07:05:21 07:05:21 8/10/2018 07:05:26 07:05:26 5 00:00:05
    INICIO DE CARGA 3 8/10/2018 07:05:26 07:05:26 8/10/2018 07:05:27 07:05:27 1 00:00:01
    FIN DE CARGA 3 8/10/2018 07:05:27 07:05:27 8/10/2018 07:05:30 07:05:30 3 00:00:03
    REINICIO DE VIAJE 1 8/10/2018 07:05:30 07:05:30 8/10/2018 11:40:32 11:40:32 16502 04:35:02
    REPARACION UNIDAD 3 8/10/2018 11:40:32 11:40:32 8/10/2018 14:07:43 14:07:43 8831 02:27:11
    REINICIO DE VIAJE 1 8/10/2018 14:07:43 14:07:43 8/10/2018 18:42:33 18:42:33 16490 04:34:50
    REPARACION CARRETERA 3 8/10/2018 18:42:33 18:42:33 8/10/2018 18:47:12 18:47:12 279 00:04:39
    REINICIO DE VIAJE 1 8/10/2018 18:47:12 18:47:12 8/10/2018 22:26:27 22:26:27 13155 03:39:15
    LLEGADA A DESCARGAR 2 8/10/2018 22:26:27 22:26:27 10/10/2018 20:15:45 20:15:45 164958 1.21:49:18
    INICIO DE DESCARGA 3 10/10/2018 20:15:45 20:15:45 10/10/2018 23:18:49 23:18:49 10984 03:03:04
    FIN DE DESCARGA 3 10/10/2018 23:18:49 23:18:49 11/10/2018 02:08:00 02:08:00 10151 02:49:11
    REINICIO DE VIAJE 1 11/10/2018 02:08:00 02:08:00 11/10/2018 03:19:33 03:19:33 4293 01:11:33
    TOMAR ALIMENTOS 3 11/10/2018 03:19:33 03:19:33 11/10/2018 06:11:02 06:11:02 10289 02:51:29
    REINICIO DE VIAJE 1 11/10/2018 06:11:02 06:11:02 11/10/2018 19:15:58 19:15:58 47096 13:04:56
    TOMAR ALIMENTOS 3 11/10/2018 19:15:58 19:15:58 12/10/2018 00:58:36 00:58:36 20558 05:42:38
    REINICIO DE VIAJE 1 12/10/2018 00:58:36 00:58:36 12/10/2018 01:53:06 01:53:06 3270 00:54:30
    ABASTECIMIENTO DIESEL 3 12/10/2018 01:53:06 01:53:06 12/10/2018 02:51:26 02:51:26 3500 00:58:20
    REINICIO DE VIAJE 1 12/10/2018 02:51:26 02:51:26 12/10/2018 04:58:30 04:58:30 7624 02:07:04
    DISPONIBLE 2 12/10/2018 04:58:30 04:58:30 12/10/2018 08:04:16 08:04:16 11146 03:05:46

    viernes, 26 de octubre de 2018 2:55
  • Hola Sergio barrios diaz:

    Este hilo es de 2011 y ya esta solucionado.

    Aunque tu duda sea similar, por el buen funcionamiento de los foros, te recomiendo que la postees como una nueva pregunta, así los usuarios pueden ayudarte, y tu pregunta ayudar al resto de miembros de la comunidad.

    De lo contrario, es muy probable, que pase desapercibida, ya que es antigua y ya esta votada.

    Gracias

    viernes, 26 de octubre de 2018 5:34
  • Alberto López Grande, entre a responder para agradecerte porque justo estaba necesitando esto mismo y tu respuesta funciona de maravilla y es tan simple que no se me había ocurrido, me has ayudado un monton, millones de gracias

    Eric

    miércoles, 19 de febrero de 2020 16:42
  • Hola, a todos.

    Quería hacerles una pregunta, a ver si de pronto alguno me puede echar una mano.

    Tengo un requerimiento donde se digita una fecha inicial y una fecha final, y necesito sacar dentro ese rango de fecha solo los últimos días de cada mes, algo similar a lo que genera eomonth, pero para cada mes incluido dentro de estas fechas.

    Por ejemplo si se digita Fechainicial='20200101' y Fechafinal = '20200325'

    El resultado debería ser:

    31/01/2020

    29/02/2020

    31/03/2020

    De otra parte seria si se puede trazar a la función eomonth varias fechas para que el me genere los últimos de cada mes, o lo otro que me podría ayudar es saber como le asigno varios valores de fecha a una variable. 

    tal vez algo como @fechas =('20200131','20200229','20200331'), es que requiero generar una consulta que filtre un inventario en esas fechas, que son las ultimas del mes.

    Muchas gracias por la atención, y de antemano agradezco si me pueden guiar o ayudar,

    jueves, 10 de septiembre de 2020 20:41
  • Hola Jorge D. Ardilla:

    Traslada tu pregunta a un nuevo hilo, y encontraremos una solución.

    Gracias

    viernes, 11 de septiembre de 2020 2:56