MySQL запрос выбора с датами, не возвращающими правильные записи - PullRequest
0 голосов
/ 10 декабря 2010

У меня есть запрос, который должен извлекать записи из нескольких таблиц, используя объединение, и фильтровать их все на основе диапазона дат. Кажется, что он вытягивает случайную группу записей - он не возвращает все записи в объединении, что, я думаю, было бы, если бы он полностью игнорировал даты, но записи, которые он извлекает, не соответствуют критериям даты.

Вот запрос; Я пробовал это двумя разными способами с одинаковым результатом.

Вариант 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

(В этом случае мы программно добавили время к начальному и конечному диапазону, чтобы обеспечить получение каждой записи с 12:01 утра в дату начала до 23:59 дня окончания).

Вариант 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

Что я получаю, так это записи с p.PurchDT, равным 2010-10-28 16:33:13, 2010-11-11 10:37:30 и несколькими другими. Хорошей новостью является то, что он вытягивает все записи с датами между указанными в запросе; Плохая новость заключается в том, что случайно (из того, что я могу сказать) также добавляются другие записи, которые не соответствуют критериям.

Кто-нибудь может указать мне правильное направление? Я мог бы поклясться, что этот код работал несколько недель назад, но сейчас это не так, хотя в него не было никаких изменений.

1 Ответ

0 голосов
/ 10 декабря 2010

Это, вероятно, потому, что вам нужно () в:

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

Результаты с неправильными датами будут иметь TypeFlags = 'S', верно?

Кроме того, если вы используете даты вмежду ними вы должны использовать день, следующий за последним, который вы хотите, иначе последний день будет включать только записи с PurchDT = 2010-12-09 00:00:00, а все остальное с того дня будет проигнорировано - я думаю.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...