2016-04-26 30 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> 

actiondatemm/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

両方のcfifが同じ値をチェックすることがわかりましたか? – 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">