2009-12-29 223 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相結合。索引?如果需要功能索引,那麼最好還是保存三個日期。這也可以讓你處理前後不同的可能的未來需求。