2010-12-09 101 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

相關問題