我使用cfspreadsheet
创建了一个查询,其中包含一个名为" Actiondate"的日期列,并使用isDate()
循环查询,表明它是一个日期列,但在查询该查询时,它被视为一个字符串。因此,当我在where子句中应用日期过滤器时,它没有正确地进行比较:
<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。我可以解决这个问题,但有没有办法做我还需要使用查询查询的东西?
答案 0 :(得分:4)
(来自评论......)
IsDate
验证值可以转换为日期。这并不意味着已经的值是一个日期/时间对象。在cfspreadsheet的情况下,返回的查询值是字符串。将它们与cfqueryparam值(日期/时间对象)进行比较时,您将比较苹果和橙子。所以QoQ将日期/时间值隐式转换为字符串,并得出错误的答案。
要在&#34; ActionDate&#34;上执行日期比较,您必须先使用CAST将字符串转换为日期/时间对象。假设所有值都是有效的日期字符串,格式为mm / dd / yyyy,请首先使用硬编码值(如11/05/2015)进行尝试。然后插入你的变量。
WHERE CAST(actionDate AS DATE) = <cfqueryparam value="11/05/2015"
cfsqltype="cf_sql_date">