2010-12-09 89 views
0

我有一个查询应该使用连接从多个表中拉出记录,并根据日期范围对它们进行过滤。它似乎是随机抽取一组记录 - 它不会返回连接中的所有记录,我想如果它完全忽略了日期,但它所做的记录与日期标准不匹配。mysql选择带日期的查询,但没有返回正确的记录

下面是查询;我用相同的结果尝试了两种不同的方式。

选项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开始日期至11:59 PM的结束日期)

选项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十六时33分十三秒,2010-11- 11 10:37:30,还有其他几个人。好消息是它将所有记录中的日期与查询中指示的日期之间的日期相提并论;坏消息是它是随机的(从我所知道的情况来看)也拉动了其他不符合标准的记录。

任何人都可以指向正确的方向吗?我可以发誓这个代码几个星期前工作,但现在不是,即使它没有任何改变。

+0

专业提示:“BETWEEN”在日期范围内效果不佳,因为范围的末尾是包含性的。 `AND col> = startdate AND col 2014-02-01 01:31:16

回答

0

这可能是因为你需要()中:

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

与不正确的日期,结果都会有TYPEFLAGS = 'S',对吧?

此外,如果您在两者之间使用日期,则应使用最后一次所需日期,否则,最后一天将仅包含PurchDT = 2010-12-09 00:00:00的记录,并且将忽略当天的所有其他日期 - 我猜。

+0

我会尝试parens。目前数据库中的所有结果都有TypeFlag = S,因此它不是检查“不正确结果”的有效方法。就日期而言,不 - 我们特别将时间值添加到查询中的日期字段中(请参阅选项1),以确保它从第一天的12:01 AM到晚上11:59 PM第二次约会。 – EmmyS 2010-12-09 21:27:35