0

我有一个表,其中包含日期时间类型的 TASK_START_DATE 和 TASK_FINISH_DATE 列

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

- 在当前的 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 
???
4

3 回答 3

2

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

Select * from Table
Where column between getdate()-14 and getdate()+14
于 2012-05-17T17:13:44.300 回答
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)
于 2012-05-17T17:21:17.047 回答
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 子句中的 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)
于 2012-05-17T18:37:22.497 回答