2012-05-17 67 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)