2009-12-29 270 views
0

我在某些时期的比较逻辑有一些问题。 我有我的数据库中的表看起来像这样:SQL日期,期间比较

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 

现在我知道如何与参数等工作,所以我basicly需要一些帮助建立sql的逻辑。

SELECT ID FROM表,其中的startDate = {0}或的startDate = {1} .....

我正在一个SQL服务器上(但我认为非方言SQL可以做的伎俩以及)

回答

2

这将工作:

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) 
+0

与2010-01-04作为开始日期的周期有3个星期的持续时间,所以它仍然运行在2010-01-11的一周,所以它确定。需要返回这一行。无论如何 – Ayrton 2009-12-29 22:13:10

+1

应该始终返回几周具有相同开始日期的周数因此,我应该了解您希望返回:范围内的任何日期在日期范围内的任何记录传入? (日期范围=开始日期到使用星期数计算的日期) – 2009-12-29 22:42:36

+0

是和一段时间始终在星期一开始,并在星期日结束。因此,当我给出开始日期和周数作为参数时,我应该得到在参数 – Ayrton 2009-12-29 22:47:57

2

试试这个

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) 
0

因为你的问题是通用的,别人也可以用稍微不同的要求在这里结束:

当然SQL Server有一个区间 -type?这将使提供的查询更简单,并且您可以处理任意时间间隔,而不仅仅是几周。我对SQL Server没有经验---它将如何与那些int-to-interval-cast wrt相结合。索引?如果需要功能索引,那么最好还是保存三个日期。这也可以让你处理前后不同的可能的未来需求。