周比较的SQL查询

时间:2012-05-17 17:10:26

标签: sql-server tsql

我有一个表格,其中包含类型为datetime的TASK_START_DATE和TASK_FINISH_DATE列

我需要帮助查询在任务时返回所有任务:(日期=只是日期 - 我想我可以在SQL 2008R2上从datetime转换到日期,它工作正常)

- 在当前日期之前的2周内或当前日期之后的两周内。

同样,我还需要TaskEnd值在前一周或两周之前的记录

我一直在尝试这样的事情会让开始日期在前两周内完成任务,但是我必须对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 
???

3 个答案:

答案 0 :(得分:2)

您可以在日期中添加天数进行比较:

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

答案 1 :(得分:2)

您不需要使用“转换”功能。 “GetDate”函数返回datetime值,列的类型是datetime。您可以直接添加日期编号:

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

答案 2 :(得分:0)

您可以在where子句中声明变量或具有比较日期。我现在使用GETDATE()来获取日期/时间,因为它返回DATETIME对象。然后我使用DATEADD将其调整为几天,几个月,几年等,然后你必须将其转换为DATE,然后再将其粘贴到DATE类型的变量中。请注意我在调整类型中传递的DATEADD方法(D =天),然后调整它+或 - 14天。

或者你可以在14天前使用,如果你不进行DATE转换......你必须从变量声明和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子句中的BETWEEN运算符是包含的,这意味着它将包含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)