0

我对某些时期的比较逻辑有一些问题。我的数据库中有一个如下所示的表:

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

所有 startDates 都从一周中的同一天(星期一)开始。

现在我需要编写一个 SQL 查询,其中有 2 个参数(开始日期和新的“周期”的周数),我需要检查并返回 startDate 相同的所有行。但是实际上在新的“期间”范围内的所有行也应该被返回。

一些例子来澄清这一点:

- 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

现在我知道如何使用参数等 - 所以我基本上需要一些逻辑帮助来构建 SQL 查询。

SELECT Id FROM table WHERE startDate={0} 或 startDate={1} .....

我正在使用 SQL Server(但我认为非方言 SQL 也可以做到这一点)。

4

3 回答 3

1

这将起作用:

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

编辑:我误解了你的问题。这应该是一个可行的解决方案:

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)
于 2009-12-29T21:50:12.053 回答
1

尝试这个

 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)
于 2009-12-29T21:54:09.033 回答
0

由于您的问题是通用的,因此其他人的要求可能会略有不同:

SQL Server 肯定有区间类型吗?这将使提供的查询更简单,并且您可以处理任意间隔,而不仅仅是几周。我对 SQL Server 没有经验 --- 它对那些 int-to-interval-casts 的表现如何。索引?如果需要功能索引,您不妨存储三个日期。这还可以让您处理不同前后间隔的未来可能需求。

于 2009-12-29T22:30:34.777 回答