2012-05-17 3 views
0

У меня есть таблица, которая имеет TASK_START_DATE и TASK_FINISH_DATE Колонны типа DateTimeTSQL запрос на неделю Сравнение

мне нужна помощь с запросом, который возвращает все задачи, когда Задача: (дата = только дата - Я думаю, что я может сделать переход на дату с даты и времени на SQL 2008R2, он отлично работает)

- в течение 2 недель предшествующего текущей даты или двух недель после текущей даты.

Точно так же мне нужны записи, чье TaskEnd значения в течение 2 недель ранее или за две недели до

Я пытался вещи, как, которые получили бы задачи, где дата начала в течение двух предыдущих недель, но я должны сделать то же самое для TASK_FINISH_DATE, и я думаю, что мои и все и все смешаны, любая помощь приветствуется.

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

Короткая версия: Как правильно написать запрос, который сочетает в себе все записи с TASK_START_DATE ИЛИ 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 возвращает значение datetime, а типы столбцов - это дата и время. Вы можете добавить номер дня прямо следующим образом:

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 дней.

Альтернативно вы можете использовать 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 является включительно, то есть он будет включать в себя запись, где 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) 
Смежные вопросы