2012-06-01 62 views
1

我有一個來自查詢查詢的AllPosts查詢。Coldfusion查詢查詢丟失日期結果BETWEEN子句

AllPosts有兩種結果:使用

WHERE PublishedDate BETWEEN '2012-05-01 00:00:00' AND '2012-05-31 23:59:00' 

Row 1| ID: 2 PublishedDate: 2012-05-30 16:47:00.0 
Row 2| ID: 3 PublishedDate: 2012-05-31 15:50:00.0 

當我做一個查詢的查詢上AllPosts稱爲FilterPosts(請注意,實際的查詢做cfqueryparam cf_sql_date這些值)

我期望FilterPosts與AllPosts具有相同的行,而我只能獲得ID 2.如果將ID 2的發佈日期更改爲2012-05-30 23:59:50.0,則Fil terPosts返回正確的結果。

我也曾嘗試

WHERE PublishedDate >= '2012-05-01 00:00:00' 
AND PublishedDate <= '2012-05-31 23:59:00' 

也有一些是與5月31日特別奇怪。

我在這裏拉我的頭髮!謝謝!

我試圖從頭構建原始查詢,奇怪的是,結果相同!

<cfset test = queryNew("Name,PublishedDate", "VarChar, Time")> 
<cfset queryAddRow(test)>  
<cfset querySetCell(test,"PublishedDate","2012-05-30 16:47:00.0")>  
<cfset querySetCell(test,"Name","First Entry")>  
<cfset queryAddRow(test)>  
<cfset querySetCell(test,"PublishedDate","2012-05-31 15:47:00.0")>  
<cfset querySetCell(test,"Name","Second Entry")>  

<cfset StartDate = CreateDate(2012, 5, 1)> 

<cfquery name="filter" dbtype="query">  
    SELECT Name, PublishedDate  
    FROM test 
WHERE 1=1 
AND PublishedDate >= <cfqueryparam value="#StartDate#" cfsqltype="cf_sql_date"> 
AND PublishedDate <= <cfqueryparam value="#DateAdd('n', -1, DateAdd('m', 1, StartDate))#" cfsqltype="cf_sql_date"> 
</cfquery> 

Filter的結果只有'FirstEntry',而不是兩者都應該。

+0

儘管在我的所有代碼行前放了4個空格,但它不會保存格式。你做了什麼不同!?感謝您的編輯! – Danomite

+1

你也需要一個空白行 - 你之後有空白,但沒有空白。 –

回答

3

奇怪的是它與cfqueryparam做。我一直在使用CREATEDATE()創建我的開始/結束日期是這樣的:

<cfset StartDate = CreateDate(2012,5, 1)> 

我在查詢這樣的查詢WHERE使用它在我的SQL:

WHERE PublishedDate >= <cfqueryparam value="#StartDate#" cfsqltype="cf_sql_date"> 

這是cf_sql_date 。它應該是cf_sql_timestamp日期已將其限制在5-31,因此在5-31日之後發佈的任何內容都被省略了。會議紀要正在下降。

感謝大家的輸入。

修復遺留代碼塊!

+2

很高興你把它修好了,那是我在添加一天到結尾的時候得到6-1的時間戳。 – Turnkey

+0

+1給Turnkey的建議。通過使用Col <#dayAfterEndDate#',您不必擔心這樣的時間部分問題。我經常使用它,它工作得很好。 – Leigh

3

你沒有說你正在使用的數據庫,但如果它的ODBC或MSSQL我平時做這樣的事情:

WHERE PublishedDate >= '2012-05-01' 
AND PublishedDate < '2012-06-01' 

基本上你一天添加到您要包括的結束日期和使用少於運算符。離開時代可以防止日期在內部構造的任何古怪。

+0

感謝您的回答。原始源數據庫是MS SQL,但它特別是查詢問題的查詢。原始的,AllPosts有正確的數據(它也恰好是查詢的查詢)。 FilteredPosts。我使用CreateDate來獲取星號/結束日期。它似乎在自己的秒鐘內增加。 – Danomite

+0

我傾向於避免Q的Q值,因爲我曾經見過類似的古怪事物,但明白爲什麼你可能希望他們保存第二次到DB。如果按照建議使用簡單日期,它仍然失敗嗎? – Turnkey

+0

即動態地嘗試:'PublishedDate <'。它應該工作正常。 – Leigh

1

嘗試通過從datetime中刪除timepart進行比較。所以,你的between應該像

WHERE PublishedDate BETWEEN '2012-05-01' AND '2012-05-31' 
+0

這對於開始日期沒問題,但仍然會放下5月31日的記錄,因爲它就像是說:'PublishedDate> ='2012-05-01 00:00:00.0'AND PublishedDate <='2012-05-31 00 :00:00.0'' – Leigh

+0

@Leigh,在這種情況下,我們需要將上限改爲「2012-06-01」而不是「2012-05-31」。 – Rahul

+0

是的,但是'BEWTWEEN'通常是包容性的,這意味着它也會記錄準確的'2012-06-01 00:00:00.0'。因此,與Turnkey的方法不同,獲取不需要的記錄的機會仍然很小。 – Leigh