SQL-запрос выбора данных между двумя полями даты - PullRequest
0 голосов
/ 16 сентября 2009

Я пытаюсь выбрать данные из таблицы, используя два поля даты (startdate и enddate). С обоими полями даты в предложении where результаты не возвращаются, с полем startdate возвращаются результаты, что происходит? Может ли кто-нибудь помочь с этой дилеммой

Мой код:

   SELECT WPP.USERID, 
          WPI.EMAIL, 
          WPI.FIRSTNAME, 
          WPI.LASTNAME, 
          WPI.INSTITUTION 
     FROM WEBPROGRAMPARTICIPANTS WPP 
     JOIN WEBPERSONALINFO WPI ON WPP.USERID = WPI.USERID 
     JOIN WEBPROGRAMS WP ON WPP.PROGRAMCODE = WP.PROGRAMCODE 
    WHERE CONFIRMED = 1 
      AND WP.PROGRAMTYPE IN ('1') 
      AND WP.PROGRAMSTARTDATE >= '2009-01-02' 
      AND WP.PROGRAMENDDATE < '2009-09-15'
 GROUP BY WPP.USERID, 
          WPI.EMAIL, 
          WPI.FIRSTNAME, 
          WPI.LASTNAME, 
          WPI.INSTITUTION 
   HAVING COUNT(WPP.PROGRAMCODE) > 1 
 ORDER BY WPP.USERID,
          WPI.EMAIL

EDIT:

вот набор результатов для просмотра

USERID PROGRAMSTARTDATE        PROGRAMENDDATE
------ ----------------------- -----------------------
26167  2009-03-09 00:00:00.000 2009-06-12 00:00:00.000 
26362  2009-03-09 00:00:00.000 2009-06-12 00:00:00.000 
26411  2009-03-09 00:00:00.000 2009-06-12 00:00:00.000 
26491  2009-03-09 00:00:00.000 2009-06-12 00:00:00.000

Ответы [ 4 ]

3 голосов
/ 16 сентября 2009

Поскольку у вас нет записей в вашей БД с

CONFIRMED = 1 AND WP.PROGRAMTYPE IN ('1') WP.PROGRAMSTARTDATE >= '2009-01-02' ??

РЕДАКТИРОВАТЬ: Как указал @ Дэвид Андрес Предложение "COUNT(WPP.PROGRAMCODE) > 1" выглядит как кандидат в преступника.

1 голос
/ 16 сентября 2009

Ну, если честно, мне кажется, это нормально. Я подозреваю, что оператор с наличием, отфильтровывающий ваши результаты, или комбинация оператора "где и есть".

0 голосов
/ 16 сентября 2009

Господа, большое спасибо за вашу помощь. Проанализировав все, что вы сказали, и попробовав различные предложения, я действительно обнаружил, что код верен. Однако в течение этого периода пользователи не посещали более одной программы за этот период. Если я вернусь еще на один год, ожидаемые данные появятся. Так что, в основном, это был просто вопрос логического учета внимания пользователя к программам.

Еще раз всем спасибо.

0 голосов
/ 16 сентября 2009

Похоже, ваш ответ равен нулю, так как "ноль пользователей участвовало в более чем одной программе за указанный диапазон дат"

Что вы можете сделать, чтобы подтвердить это, немного изменить свой запрос, чтобы показать, в скольких программах каждый пользователь участвовал :

   SELECT WPP.USERID, 
          WPI.EMAIL, 
          WPI.FIRSTNAME, 
          WPI.LASTNAME, 
          WPI.INSTITUTION,
          COUNT(WPP.PROGRAMCODE)
     FROM WEBPROGRAMPARTICIPANTS WPP 
     JOIN WEBPERSONALINFO WPI ON WPP.USERID = WPI.USERID 
     JOIN WEBPROGRAMS WP ON WPP.PROGRAMCODE = WP.PROGRAMCODE 
    WHERE CONFIRMED = 1 
      AND WP.PROGRAMTYPE IN ('1') 
      AND WP.PROGRAMSTARTDATE >= '2009-01-02' 
      AND WP.PROGRAMENDDATE < '2009-09-15'
 GROUP BY WPP.USERID, 
          WPI.EMAIL, 
          WPI.FIRSTNAME, 
          WPI.LASTNAME, 
          WPI.INSTITUTION 
 ORDER BY COUNT(WPP.PROGRAMCODE) DESC, 
          WPP.USERID,
          WPI.EMAIL

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

...