2016-04-26 122 views
1

我有一個使用cfspreadsheet創建的查詢,它具有一個名爲「Actiondate」的日期列,並且循環查詢使用isDate()顯示它是一個日期列,但是在查詢中查詢它是被視爲一個字符串。所以,當我在where子句中應用的日期過濾器,它不能正確地做比較:查詢日期比較的ColdFusion查詢

<cfquery ... > 
SELECT * 
FROM arguments.q 
WHERE 1=1 
<cfif isDate(arguments.dateFrom)> 
    AND actiondate >= <cfqueryparam cfsqltype="cf_sql_timestamp" value="#arguments.dateFrom#"> 
</cfif> 
<cfif isDate(arguments.dateFrom)> 
    AND actiondate <= <cfqueryparam cfsqltype="cf_sql_timestamp" value="#arguments.dateTo#"> 
</cfif> 
</cfquery> 

actiondate進來的mm/dd/yyyy格式。當我用字符串文字做where子句作爲測試,它的工作原理:

...where actiondate = '11/05/2015' --returns all rows with that "date" 

<cfset tempdate = createdate(2015,11,5)>... 
...where actiondate = <cfqueryparam cfsqltype="cf_sql_date" value="#temp#"> --returns nothing 

但同樣,isDate(actiondate)返回true通過查詢循環時。我可以解決這個問題,但是有沒有辦法做到我仍然需要使用查詢查詢?

+3

你意識到你的兩個cfifs檢查相同的值? – Tomalak

+0

將參數用引號括起來:''''。那樣有用嗎? – trincot

+0

@trincot,你親自嘗試過嗎?你有沒有得到預期的結果? –

回答

4

(來自評論...)

IsDate驗證值可以被轉換成日期。這並不意味着數值已經是是日期/時間對象的。在cfspreadsheet的情況下,返回的查詢值是字符串。當您將它們與cfqueryparam值(日期/時間對象)進行比較時,您會比較蘋果和橘子。因此,QoQ會將日期/時間值隱式轉換爲字符串,並提供錯誤的答案。

要對「ActionDate」執行日期比較,您必須先使用CAST將字符串轉換爲日期/時間對象。假設所有的值都是有效的日期字符串,格式爲mm/dd/yyyy,請先使用硬編碼值(如11/05/2015)嘗試。然後插入你的變量。

WHERE CAST(actionDate AS DATE) = <cfqueryparam value="11/05/2015" 
            cfsqltype="cf_sql_date">