执行QoQ后没有获得所需的输出

时间:2013-07-16 18:02:22

标签: mysql coldfusion coldfusion-8 qoq

我正在运行以下SQL查询,但没有获得所需的输出:

 <cfquery datasource = "XX.XX.X.XX" name="master">
    SELECT count(Timedetail) as Occurances, date_format(Timedetail,'%m-%d-%Y') 
    FROM   MyDatabase
    WHERE  EVENTS = "FIRST" GROUP BY Timedetail ;
 </cfquery> 
<cfquery dbtype="query" name="detail">
    SELECT  *
    FROM    master 
    WHERE  Timedetail >= <cfqueryparam value="#form.startdate#" cfsqltype="cf_sql_date"> 
    AND    Timedetail <  <cfqueryparam value="#dateAdd('d', 1,form.enddate)#" cfsqltype="cf_sql_date">;
</cfquery> 

相关的数据库列是:

  • TimeDetail:包含所有与日期和时间相关的值
  • Events:包含FIRST,SECOND,THIRD等值。为方便起见,我在这里提到了FIRST。

就startdate和enddate参数而言,我已按如下方式设置它们:

 <cfparam name="form.startdate" default="#dateformat(now()-5, 'mm/dd/yyyy')#">
 <cfparam name="form.enddate" default="#dateformat(now()-1, 'mm/dd/yyyy')#">
 <cfparam name="form.selectdate" default="#dateformat(now(), 'mm/dd/yyyy')#">

因此,我的主查询显示以下结果:

  OCCURANCES  TIMEDETAIL
1   15712   06-06-2013
2   7533    06-07-2013
3   20899   06-10-2013
4   24075   06-11-2013
5   24219   06-12-2013
6   21485   06-13-2013
7   22661   06-14-2013
8   20010   06-15-2013
9   18032   06-16-2013
10  27588   06-17-2013
11  25861   06-18-2013
12  21106   06-19-2013
13  22281   06-20-2013
14  21736   06-21-2013
15  20060   06-22-2013
16  18384   06-23-2013
17  24233   06-24-2013
18  39901   06-25-2013
19  31132   06-26-2013
20  41744   06-27-2013
21  38926   06-28-2013
22  34910   06-29-2013
23  25682   06-30-2013
24  48400   07-01-2013
25  42847   07-02-2013
26  30014   07-03-2013
27  21047   07-04-2013
28  29982   07-05-2013
29  25056   07-06-2013
30  13733   07-07-2013
31  35753   07-08-2013
32  20966   07-09-2013
33  41713   07-10-2013
34  30976   07-11-2013 

而且,我想知道为什么我的“详细信息”查询没有显示任何内容,尽管我已将startdate参数指定为2013-06-12并将enddate参数指定为2013-07-12,这在结果集中可见,如下所述。它应显示我指定的日期范围的出现和时间详细信息。

RESULTSET   
query
    OCCURANCES  TIMEDETAIL
CACHED  false
EXECUTIONTIME   0
SQL     SELECT * FROM master WHERE Timedetail >= ? AND Timedetail <?;
SQLPARAMETERS   
array
1   {ts '2013-06-12 00:00:00'}
2   {ts '2013-07-12 00:00:00'}  

2 个答案:

答案 0 :(得分:2)

在数据类型方面,内存查询(QoQ)可能很棘手。与数据库相比,他们对隐式数据类型转换的了解要少得多。通过使用MySQL的date_format函数,您实际上将日期时间值转换为字符串。因此,当您运行QoQ时,CF实际上可能正在执行字符串比较,这会产生与 date 比较非常不同的结果。可以解释为什么你得到了错误的结果。

尝试更改数据库查询以返回日期时间值而不是字符串:

SELECT 
   COUNT(Timedetail) as Occurances
   , STR_TO_DATE( DATE_FORMAT(Timedetail,'%m-%d-%Y'), '%m-%d-%Y') AS Timedetail
FROM   ....
WHERE  ...

<强>更新

另一种选择是在QoQ中将值作为DATE进行CAST。这将迫使QoQ执行日期比较,而不是字符串比较:

WHERE  CAST(Timedetail AS DATE) >= <cfqueryparam value="#form.startdate#" 
                                          cfsqltype="cf_sql_date"> 

答案 1 :(得分:0)

我自己想通了。 MySQL date_format()函数返回一个字符串,而不是datetime对象,因此在ColdFusion中运行查询查询时,我使用了CF_SQL_VARCHAR数据类型而不是CF_SQL_DATE,一切正常。


(从评论中更新)

上面的答案证明是错的。当我使用CF_SQL_VARCHAR时,我得到了意想不到的结果,实际上是不完整的结果。当我应用STR_TO_DATE函数时,它运行正常。