2012-05-17 66 views
0

我有了一個TASK_START_DATE和datetime類型TSQL查詢周比較

我需要在任務返回的所有任務的查詢幫助TASK_FINISH_DATE列的表:(日期=只是日期 - 我想我可以轉換爲SQL 2008R2上從datetime開始的日期,它工作正常)

- 在當前日期的前兩週或當前日期後的兩週內。

同樣地,我也需要他們TaskEnd值爲2個星期之前的兩週內記錄之前

我一直在努力的事情像它會得到任務,其中的開始日期是前兩個星期之內,但我必須爲TASK_FINISH_DATE做同樣的事情,我認爲我和你的或者都是混亂起來,任何幫助表示讚賞。

Convert(Date, TASK_START_DATE) <= Convert(Date, DateAdd(ww, -2, GetDate())) 

短版: 如何正確地寫一個查詢,結合了TASK_START_DATE OR TASK_END_DATE所有記錄兩週內,未來或過去的,即

Select Task_ID, TASK_NAME, TASK_START_DATE, TASK_END_DATE 
where 
??? 

回答

2

您可以添加天您的日期進行比較:

Select * from Table 
Where column between getdate()-14 and getdate()+14 
+0

沒有想到的是SQL隱式轉換的DT爲數字,允許添加(它是轉換爲浮動也許?),但你每天都會學到新的東西!好的提示 - 我一直在使用dateadd(d,1,xxx) – Charleh

2

您不需要使用「轉換」功能。 「GetDate」函數返回日期時間值,而列的類型是日期時間。您可以直接添加日期編號,如下所示:

Select * from Table 
Where (TASK_START_DATE between getdate() - 14 and getdate() + 14) 
or (TASK_FINISH_DATE between getdate() - 14 and getdate() + 14) 
0

您可以聲明變量或在where子句中有正確的比較日期。我使用GETDATE()來獲取當前的日期/時間,因爲它返回一個DATETIME對象。然後我使用DATEADD來調整它幾天,幾個月,幾年等,然後在將它粘貼到DATE類型的變量中之前,必須將其轉換爲DATE。請注意,在DATEADD方法中,我傳入調整類型(D =天),然後調整它+或 - 14天。

另外,如果您不進行DATE轉換,您可以只用14天前的分鐘...您必須從變量聲明以及where子句中刪除轉換。取決於你想要的結果。

DECLARE @twoWeeksAgo DATE = CONVERT(DATE, DATEADD(D, -14, GETDATE())); 
DECLARE @twoWeeksAhead DATE = CONVERT(DATE, DATEADD(D, 14, GETDATE())); 

SELECT 
    Task_ID, 
    TASK_NAME, 
    TASK_START_DATE, 
    TASK_END_DATE 
FROM 
    TABLE 
WHERE 
    CONVERT(DATE, TASK_START_DATE) BETWEEN @twoWeeksAgo AND @twoWeeksAhead 
    OR CONVERT(DATE, TASK_END_DATE) BETWEEN @twoWeeksAgo AND @twoWeeksAhead 

還要注意的是,運營商之間的WHERE子句中的是包容的,這意味着它將包括記錄中,其中TASK_START_DATE等於由變量舉行的日期。如果你想排除具有相同的值@twoWeeksAhead記錄,例如,你將不得不使用像

WHERE 
    (CONVERT(DATE, TASK_START_DATE) >= @twoWeeksAgo 
     AND CONVERT(DATE, TASK_START_DATE) < @twoWeeksAhead) 
    OR (CONVERT(DATE, TASK_END_DATE) >= @twoWeeksAgo 
     AND CONVERT(DATE, TASK_END_DATE) < @twoWeeksAhead)