Pregunta

Tengo algún problema con la lógica de la comparación de algunos períodos. Tengo una mesa en mi base de datos que se ve así:

Id|startDate  |amount of weeks|
--------------------------------
A1|2010-01-04 | 3
B3|2010-01-11 | 2

Todas las citas de inicio comienzan el mismo día de la semana (lunes)

Ahora necesito escribir un SQL donde tengo 2 parámetros (una fecha de inicio y la cantidad de semanas de un nuevo 'período') y necesito verificar y devolver todas las filas que StartDate es la misma. Pero todas las filas que están realmente dentro del rango del nuevo "período" deben devolverse también

Algunos ejemplos para aclarar esto:

- when I give the following parameters (2010-01-04,1) I would need to have row 1 with id A1 returned
- (2010-01-11,1) ---> return A1,B3
- (2009-12-28,1) ---> return nothing
- (2009-12-28,2) ---> return A1
- (2010-01-18,1) ---> return A1,B3

Ahora sé cómo trabajar con parámetros, etc., por lo que básicamente necesitaría un poco de ayuda en la lógica para construir el SQL.

Seleccione ID de la tabla donde startDate = {0} o startDate = {1} ..... .....

Estoy trabajando en un servidor SQL (pero creo que SQL sin dialecto también puede hacer el truco)

¿Fue útil?

Solución

Esto funcionará:

SELECT
    ID
FROM table
WHERE startDate = @startParam
AND DATEADD(WEEK, [amount of weeks], startDate) < DATEADD(WEEK, @numWeeksParam, @startParam)

Editar: entendí mal tu pregunta. Esta debería ser una solución de funcionamiento:

SELECT
    ID
FROM TABLE
WHERE startDate BETWEEN @startParam AND DATEADD(WEEK, @numWeeksParam, @startParam)
OR DATEADD(WEEK, [amount of weeks], startDate) BETWEEN @startParam AND DATEADD(WEEK, @numWeeksParam, @startParam)
OR @startParam BETWEEN startDate AND DATEADD(WEEK, [amount of weeks], startDate)
OR DATEADD(WEEK, @numWeeksParam, @startParam) BETWEEN startDate AND DATEADD(WEEK, [amount of weeks], startDate)

Otros consejos

prueba esto

 Select t.*
 From Table T
 Where @StartDate 
         Between t.StartDate And DateAdd(week, t.AmtWeeks, T.StartDate)
    or DateAdd(week, @AmtWeeks, StartDate) 
         Between t.StartDate And DateAdd(week, t.AmtWeeks, T.StartDate)

Dado que su pregunta es genérica, y otros pueden terminar aquí con requisitos ligeramente diferentes:

Seguramente SQL Server tiene un intervalo-¿escribe? Eso haría que las consultas proporcionadas sean más simples, y podría manejar intervalos arbitrarios, no solo semanas. No tengo experiencia con SQL Server --- ¿Cómo le irá con esos WRT de INT-T-Interval-Casts? a los índices? Si se requiere un índice funcional, también podría almacenar un triple de fechas. Eso también le permitirá manejar un posible requisito futuro de diferentes intervalos antes y después.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top