2010-12-09 4 views
0

J'ai une requête qui est censée tirer des enregistrements de plusieurs tables en utilisant une jointure, et tous les filtrer en fonction d'une plage de dates. Il semble tirer un groupe aléatoire d'enregistrements - il ne retourne pas tous les enregistrements dans la jointure, ce que j'imagine s'il ignorait complètement les dates, mais les enregistrements qu'il tire ne correspondent pas aux critères de date.mysql sélectionner la requête avec des dates ne pas retourner les enregistrements corrects

Voici la requête; Je l'ai essayé de deux manières différentes avec le même résultat.

Option 1:

SELECT p.PurchActvtyID, p.PurchAmt, p.CcAuthCode, p.PurchDT, v.VoucherNbr, 
a1.name as billName, a1.company as billCompany, a1.address1 
    FROM arrc_PurchaseActivity p 
LEFT JOIN arrc_Voucher v ON p.VoucherID = v.VoucherID 
LEFT JOIN jos_customers_addresses a1 ON p.AcctID = a1.id 
where v.TypeFlag='S' or v.TypeFlag is null 
and p.PurchDT between '20101201000000' and '20101209235959' order by v.ActivatedDT asc 

(Dans ce cas, nous avons fois ajouté à la programmation début et de fin de gamme nous assurer d'obtenir tous les enregistrements de 00h01 à la date de début à 11:59 PM à la date de fin)

Option 2:.

SELECT p.PurchActvtyID, p.PurchAmt, p.CcAuthCode, p.PurchDT, v.VoucherNbr, 
    a1.name as billName, a1.company as billCompany, a1.address1     
    FROM arrc_PurchaseActivity p 
LEFT JOIN arrc_Voucher v ON p.VoucherID = v.VoucherID 
LEFT JOIN jos_customers_addresses a1 ON p.AcctID = a1.id 
where v.TypeFlag='S' or v.TypeFlag is null 
and p.PurchDT between '2010-12-01' and '2010-12-09' order by v.ActivatedDT asc 

Ce que je veux revenir est des dossiers avec p.PurchDT égal à 2010-10-28 16:33:13, 2010-11- 11 10:37:30, et plusieurs autres. Les bonnes nouvelles sont qu'il tire dans tous les dossiers avec des dates entre ceux indiqués dans la question; la mauvaise nouvelle est que c'est de manière aléatoire (d'après ce que je peux dire) tirer d'autres records qui ne correspondent pas aux critères.

Quelqu'un peut-il me diriger dans la bonne direction? J'aurais pu jurer que ce code fonctionnait il y a plusieurs semaines, mais maintenant il ne l'est pas, même s'il n'y a pas eu de changements.

+0

Astuce: 'BETWEEN' ne fonctionne pas très bien pour les plages de dates car la fin de la plage est inclusive. 'AND col> = startdate ET col

Répondre

0

C'est probablement parce que vous avez besoin() dans:

where (v.TypeFlag='S' or v.TypeFlag is null) 

Les résultats avec des dates incorrectes devraient tous TypeFlags = 'S', non? En outre, si vous utilisez des dates dans l'intervalle, vous devez utiliser le jour à côté du dernier, sinon le dernier jour inclurait uniquement les enregistrements avec PurchDT = 2010-12-09 00:00:00 et tout le reste de ce jour serait ignoré - j'imagine .

+0

Je vais essayer les parens. Tous les résultats actuellement dans la base de données ont TypeFlag = S, donc ce n'est pas un moyen valide de vérifier les "résultats incorrects". En ce qui concerne les dates, non - nous avons spécifiquement ajouté la valeur de temps aux champs de date dans la requête (voir l'option 1) pour nous assurer que tout va de 12h01 à la première date jusqu'à 23h59 sur le deuxième date. – EmmyS

+0

vous devriez vérifier cela, je suppose - http://dev.mysql.com/doc/refman/5.0/en/operator-precedence.html – theMage

+0

Merci; Je garderai ce signet à partir de maintenant. Je ne sais pas pourquoi je n'ai jamais eu de problèmes avec l'utilisation de parens avant ... Je suppose que j'ai juste eu de la chance. En tout cas, il semble que ça l'a réglé. – EmmyS

Questions connexes