Principales respuestas
VISUALIZAR TODAS LAS FECHAS DENTRO DE UN RANGO DE FECHAS

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
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/- Propuesto como respuesta Alberto López Grande (qwalgrande)Moderator jueves, 10 de febrero de 2011 20:41
- Marcado como respuesta ApreSabi jueves, 10 de febrero de 2011 20:50
-
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/- Propuesto como respuesta Alberto López Grande (qwalgrande)Moderator martes, 15 de febrero de 2011 22:06
- Marcado como respuesta ApreSabi martes, 15 de febrero de 2011 22:22
- Editado Alberto López Grande (qwalgrande)Moderator martes, 15 de febrero de 2011 22:24 Errata
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/- Propuesto como respuesta Alberto López Grande (qwalgrande)Moderator jueves, 10 de febrero de 2011 8:20
-
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?
-
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 -
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 -
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/- Editado Alberto López Grande (qwalgrande)Moderator jueves, 10 de febrero de 2011 14:29 Ampliacion
-
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) = 5bueno 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 -
Hola.
Sólo has de añadir esos filtros adicionales a tu consulta o en la cte, partir de esa fecha inicial y final:
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.-- Pon tu fecha inicial y final aquí select @fec_inicio = '20091001', @fec_fin = '20091031'
Alberto López Grande
SQL Server MVP
Visita mi blog en http://qwalgrande.blogspot.es/ -
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 -
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/- Propuesto como respuesta Alberto López Grande (qwalgrande)Moderator jueves, 10 de febrero de 2011 20:41
- Marcado como respuesta ApreSabi jueves, 10 de febrero de 2011 20:50
-
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/- Propuesto como respuesta Alberto López Grande (qwalgrande)Moderator martes, 15 de febrero de 2011 22:06
- Marcado como respuesta ApreSabi martes, 15 de febrero de 2011 22:22
- Editado Alberto López Grande (qwalgrande)Moderator martes, 15 de febrero de 2011 22:24 Errata
-
-
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
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 -
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
-
-
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,
-