SQL日期,期间比较

时间:2009-12-29 21:45:23

标签: sql sql-server comparison date period

我在某些时期的比较逻辑上遇到了一些问题。 我的数据库中有一个表格如下:

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也可以做到这一点)

3 个答案:

答案 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。索引?如果需要功能索引,您可以存储三个日期。这也可以让您处理不同的前后间隔可能的未来需求。