SQL WHERE запрос по диапазону дат - PullRequest
3 голосов
/ 02 декабря 2011

В моей таблице 118 записей, детализирующих проекты.2 поля, которые меня интересуют, это startdate и enddate.

Мне нужно создать отчет из этого представления, который показывает, какие проекты были «активными» в следующих диапазонах дат:

01 /01/2011 - 01/12/2011

Я попробовал следующее предложение WHERE:

WHERE startdate BETWEEN '01/04/2011' AND '01/12/2011' 
OR enddate BETWEEN '01/04/2011' AND '01/12/2011'
OR startdate <= '01/04/2011' AND enddate >= '01/12/2011'

То, что происходит, кажется неправильным, отображаются только несколько записей и многие из которыхЯ знаю, что факт должен отображаться не так, как, например, один проект с датой начала 20/07/2011 и конца 21/11/2011 исчезает, когда выполняется запрос WHERE.

Может кто-нибудь видетьошибка с этим запросом WHERE

enter image description here

Ответы [ 5 ]

5 голосов
/ 02 декабря 2011
WHERE
    startdate <= '2011-12-01'
AND enddate   >= '2011-01-01'

(Предполагая, что значение в enddate является последней датой, когда проект активен)

Примеры использования чисел, поиск всего, что перекрывается со 100 до 200 ...

Start | End | Start <= 200 | End >= 100

 000  | 099 |  Yes         | No
 101  | 199 |  Yes         | Yes     (HIT!)
 201  | 299 |  No          | Yes
 000  | 150 |  Yes         | Yes     (HIT!)
 150  | 300 |  Yes         | Yes     (HIT!)
 000  | 300 |  Yes         | Yes     (HIT!)

Это абсолютно необходимо И в логике:)

С точки зрения вашего запроса ...

Ваш запрос с круглыми скобками выглядит следующим образом ...

WHERE
  (
     startdate BETWEEN '01/04/2011' AND '01/12/2011'
  OR enddate   BETWEEN '01/04/2011' AND '01/12/2011'
  OR startdate <= '01/04/2011'
  )
  AND enddate >= '01/12/2011'

Но ваш пример никогда не соответствует последнему условию AND.Попробуйте добавить скобки, чтобы быть более явным ...

WHERE
     (startdate BETWEEN '01/04/2011' AND '01/12/2011')
  OR (enddate   BETWEEN '01/04/2011' AND '01/12/2011')
  OR (startdate <= '01/04/2011' AND enddate >= '01/12/2011')
1 голос
/ 02 декабря 2011

Перед запросом добавьте

set dateformat dmy

Также возможно добавить несколько скобок

WHERE 
(startdate BETWEEN '01/01/2011' AND '01/12/2011')
OR 
(enddate BETWEEN '01/01/2011' AND '01/12/2011')
OR 
(startdate <= '01/01/2011' AND enddate >= '01/12/2011')
0 голосов
/ 05 декабря 2011

Мой оригинальный запрос работал, однако база данных, к которой я подключался, имела разные форматы даты для моего запроса.

0 голосов
/ 02 декабря 2011

Каждый смотрит на это неправильно, сравнивая начальную и конечную даты со строкой, когда вы можете сравнить строку со столбцами; Ниже приведен самый простой способ выяснить, что вы хотите:

where ( '01/04/2011' between startdate and enddate
          or  '01/12/2011' between startdate and enddate
         )
0 голосов
/ 02 декабря 2011

Предполагая, что startdate и enddate являются полями даты,

Попробуйте:

WITH Dates AS ( 
      SELECT [Date] = @StartDate
      UNION ALL SELECT [Date] = DATEADD(DAY, 1, [Date])
      FROM Dates WHERE [Date] <= DATEADD(DAY, -1, @EndDate)
) 
-- YOUR SELECT STATEMENT
-- YOUR FROM STATEMENT
CROSS APPLY Dates
WHERE [Date] BETWEEN startdate AND enddate 
-- The rest of your where statement here
OPTION(MAXRECURSION 0);

Объявление даты начала как 01/01/2011 и даты окончания как 01/12/2011

...