Coldfusion MySQL 查询中的查询

Coldfusion MySQL Query within a Query

我正在尝试从为特定用户检索的完整记录集中检索属于特定年份和月份的记录。首先,有问题的字段 itemdate 是 MySql type Datetime(例如 2016-08-15 20:00:25)。一个用户有4行记录:

2016-08-15 20:00:25
2015-06-01 20:25:05
2016-08-15 20:26:00
2016-08-15 23:30:35

特定用户的这些记录通过以下方式检索:

<cfquery datasource="userdatbase"name="reportlist">
select itemid, itemdate, itemvalue
from itemlib
where userid = '#currentuserid#'
</cfquery>

当前年月由以下因素决定:

<cfset thisyear = #Year(Now())#>
<cfset thismonth = #Month(Now())#>

现在过滤原始查询并仅获取当前年份和月份的查询:

    <cfquery dbtype="query" name="detail"> 
        select itemid, itemdate, itemvalue
        from reportlist
        where year(itemdate) = #thisyear#
        and month(itemdate) = #thismonth#
    </cfquery>

我收到以下错误:

执行数据库查询时出错。

Query Of Queries 语法错误。 遇到“年。条件表达式不正确,应为 [like|null|between|in|comparison] 条件之一,

我试过这样做:

    <cfquery dbtype="query" name="detail"> 
        select itemid, itemdate, itemvalue
        from reportlist
        where #year(reportlist.itemdate)# = #thisyear#
        and #month(reportlist.itemdate)# = #thismonth#
    </cfquery>

这将消除错误。但是,我在 detail 查询中得到了所有 4 行记录,而不是预期的 3 行。我不希望 2015-06-01 20:25:05记录被选中,但是确实如此。我正在为此挠头。任何帮助表示赞赏。提前谢谢你。

coldfusion Query of Queries (QofQ) 不具备 dbms 的全部功能。 QofQ 语法不支持 year()

您的第二个查询在语法上是正确的,因为它传递了 reportlist.itemdate 的值,这将是 第一行 itemdate 的值] 的查询 reportlist(假设您没有遍历 reportlist)。 ColdFusion 将此解释为比较两个文字值而不是比较查询中的行值。

或者,您可以将变量 (fromDate) 设置为所需月份的第一个日期,然后在项目日期为 >= fromDate 和 < 的地方过滤查询从日期加 1 个月。见下文:

<!--- set fromDate to the first date of the month --->
<cfset fromDate = createDate(thisyear, thismonth, 1) />
<cfquery dbtype="query" name="detail"> 
    select itemid, itemdate, itemvalue
    from reportlist
    where itemdate >= <cfqueryparam value="#fromDate#" cfsqltype="cf_sql_date" />
          and itemdate < <cfqueryparam value="#dateAdd('m', 1, fromDate)#" cfsqltype="cf_sql_date" />
</cfquery>

这通过使用 ColdFusion QoQ 中支持的比较器来完成同样的事情。

这里有一些有用的文档:http://help.adobe.com/en_US/ColdFusion/9.0/Developing/WSc3ff6d0ea77859461172e0811cbec0e4fd-7ff0.html