2012-06-14 126 views
0

我在這個查詢中做錯了什麼?奇怪的appengine查詢結果

SELECT * FROM TreatmentPlanDetails 
WHERE 
    accountId = 'ag5zfmRvbW9kZW50d2ViMnIRCxIIQWNjb3VudHMYtcjdAQw' AND 
    status = 'done' AND 
    category = 'chirurgia orale' AND 
    setDoneCalendarEventStartTimestamp >= [timestamp for 6 june 2012] AND 
    setDoneCalendarEventStartTimestamp <= [timestamp for 11 june 2012] AND 
    deleteStatus = 'notDeleted' 
ORDER BY setDoneCalendarEventStartTimestamp ASC 

我沒有收到任何記錄,我確信有記錄滿足where子句的條件。爲了獲得正確的記錄,我必須將時間戳間隔擴大1毫秒。這是正常的嗎?此外,如果我通過刪除類別過濾器來修改此查詢,我會得到正確的結果。這絕對是奇怪的。 我也問過谷歌組,但我沒有得到答案。總之,對於細節: https://groups.google.com/forum/?fromgroups#!searchin/google-appengine/query/google-appengine/ixPIvmhCS3g/d4OP91yTkrEJ

+0

category ='chirurgia orale'=> category ='chirurgia orale'AND 我認爲這只是錯字。 – zinking

+0

是的,這是一個錯字。抱歉。 –

回答

1

讓我們專門討論創建時間戳以進入查詢。您使用什麼代碼創建時間戳記錄?顯然這很重要,因爲模糊一點會影響查詢。在數據存儲中,時間戳記是以整數表示以毫秒錶示的posix時間戳,即自1970年1月1日以來的微秒數(不包括閏秒)。同樣重要的是,日期(即沒有時間)被表示爲午夜,即當天的最早時間。但請告訴我們確切的代碼。 (顯示您嘗試檢索的記錄的實際內容也很重要。)

+0

嗨,謝謝你的回答。爲了避免這些問題,我總是將日期存儲爲長值(自1970年1月1日以來的毫秒)。下面是查詢:'SELECT * 從那裏帳戶ID = 'ag5zfmRvbW9kZW50d2ViMnIRCxIIQWNjb3VudHMYtcjdAQw' AND 狀態= '完成' TreatmentPlanDetails AND 類別= 'chirurgia ORALE' AND setDoneCalendarEventStartTimestamp> = 1338933600000 AND setDoneCalendarEventStartTimestamp <= 1339365600000 AND deleteStatus =' notDeleted' ORDER BY setDoneCalendarEventStartTimestamp ASC' –

+0

這是查詢不返回的第一條記錄。爲了簡單起見,我只會報告查詢中涉及的屬性:'accountId ='ag5zfmRvbW9kZW50d2ViMnIRCxIIQWNjb3VudHMYtcjdAQw';狀態=「完成」; category ='chirurgia orale'; setDoneCalendarEventStartTimestamp = 1338933600000; deleteStatus ='notDeleted'' –

+0

這是第二條記錄。這是查詢不返回的第一個記錄。爲簡單起見,我將僅報告查詢中涉及的屬性: 'accountId ='ag5zfmRvbW9kZW50d2ViMnIRCxIIQWNjb3VudHMYtcjdAQw'; category ='chirurgia orale' status ='done'; setDoneCalendarEventStartTimestamp = 1338933600000; deleteStatus ='notDeleted'' –

0

因爲你寫的:

,如果我通過刪除類別過濾器修改此查詢,我得到 正確的結果

這可能意味着,在將匹配記錄寫入數據存儲時,類別未被編入索引。如果要將它們添加到新創建的索引中,則必須將記錄重新寫入數據存儲。

+0

如果通過重寫你的意思是簡單地更新記錄,我已經做到了。此外,它並沒有解釋爲什麼通過擴大時間戳記間隔2毫秒,記錄開始匹配,而在沒有類別篩選器的查詢版本中,匹配時沒有加寬間隔... –

1

一邊不是特定於您的問題:實體屬性名稱作爲您的存儲配額的一部分。如果這將是一個巨大的數據集,那麼您可能會花費比您希望爲setDoneCalendarEventStartTimestamp等屬性名稱更多的$$。

+0

男人,你管這麼多。你是對的。我從來沒想過這點。謝謝。 –