我在某些时期的比较逻辑上遇到了一些问题。 我的数据库中有一个表格如下:
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表WHERE startDate = {0}或startDate = {1} .....
我正在研究SQL服务器(但我认为非方言sql也可以做到这一点)
答案 0 :(得分: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)
答案 1 :(得分: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)
答案 2 :(得分:0)
由于您的问题是通用的,而其他人可能会以稍微不同的要求结束:
当然SQL Server有一个 interval -type?这将使提供的查询更简单,您可以处理任意间隔,而不仅仅是几周。我对SQL Server没有经验---如何使用这些int-to-interval-cast wrt。索引?如果需要功能索引,您可以存储三个日期。这也可以让您处理不同的前后间隔可能的未来需求。