2009-09-16 3 views
0

J'essaie de sélectionner des données d'une table, en utilisant deux champs de date (startdate et enddate). Avec les deux champs de date dans la clause where, aucun résultat n'est renvoyé, avec le champ startdate, les résultats sont renvoyés, que se passe-t-il? Quelqu'un peut-il aider à ce dilemneRequête SQL sélectionner des données entre deux champs de date

Mon code est:

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:

ici est un jeu de résultats pour regarder

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 
+1

Afficher les lignes renvoyées lorsqu'une date est supprimée (seules quelques lignes et uniquement les colonnes userid, programstartdate et programenddate sont nécessaires). –

+0

Est-il possible qu'aucun des programmes confirmés de type 1 ne commence le 2 janvier 2009 ou après? –

+0

en ajoutant à la suggestion d'Eric J., lors de la sélection des lignes, trié par WP.PROGRAMSTARTDATE desc – akf

Répondre

3

Parce que vous avez pas d'enregistrements dans votre DB avec

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

EDIT: Comme @David Andres a souligné La clause "COUNT(WPP.PROGRAMCODE) > 1" ressemble à un candidat pour le coupable.

+1

Regardez de plus près la clause HAVING ... –

+0

@David Andres: c'est un très bon point! –

+0

@Mitch: N'hésitez pas à inclure cela si vous le souhaitez dans votre réponse. –

1

Eh bien, pour être honnête, ça me semble bien. Je soupçonne que la déclaration ayant filtré vos résultats, ou un combo de la déclaration where et having.

0

Il semble que votre réponse est zéro, comme dans « zéro utilisateurs ont participé à plus d'un programme au cours de cette plage de dates »

Qu'est-ce que vous pouvez faire pour confirmer est modifier votre requête légèrement pour montrer combien de programmes chaque utilisateur ne participer à:

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 

Cela devrait liste pour vous tous les utilisateurs et le nombre de projets pour cette plage de dates, d'abord par le commander comte, puis par les critères que vous avez initialement mis en place. Il supprime la clause ayant, qui semble être la cause de votre douleur.

0

Messieurs, merci beaucoup pour votre aide. En analysant tout ce que vous avez dit et en essayant les différentes suggestions, j'ai découvert que le code était juste. Cependant, pendant cette période, les utilisateurs n'ont pas assisté à plus d'un programme pendant cette période. Si je reviens juste une année de plus, les données attendues seront disponibles. Donc, fondamentalement, ce n'était qu'une question d'affacturage logique de l'utilisateur aux programmes.

Merci encore à tous.

Questions connexes