我有一个表格,其中包含类型为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
???
答案 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)