2013-07-16 30 views
0

後我運行下面的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等值。爲了方便和清晰起見,我在這裏首先提到。

至於開始日期和結束日期參數而言,我已經將它們設置如下:

<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'} 

回答

0

嗯,我想出了我自己的。 MySQL date_format()函數返回一個字符串,而不是日期時間對象,所以當在ColdFusion中運行我的查詢查詢時,我使用CF_SQL_VARCHAR數據類型而不是CF_SQL_DATE,並且一切正常。


(更新從評論)

上面的答案竟然是錯的。當我使用CF_SQL_VARCHAR時,我得到了意想不到的結果,實際上結果不完整。當我應用STR_TO_DATE函數時,它工作正常。

+0

@Leigh非常感謝您的一致幫助。讚賞。 – Tan

+0

不客氣! – Leigh

+0

哎呀,我剛剛意識到我誤解了你的答案。如果可能,最好將列值保留爲'datetime'並執行* date *比較。嘗試[解決我提到的](http://stackoverflow.com/a/17684464/104223)。字符串比較更挑剔。即使額外的空間可能會導致查詢返回零記錄。 – Leigh

2

在數據類型方面,內存查詢(QoQ)可能會非常棘手。對於隱式數據類型轉換,它們遠不像數據庫那樣繁瑣。通過使用MySQL的date_format函數,您實際上將日期時間值轉換爲字符串。所以當你運行你的QoQ時,CF實際上可能會執行字符串比較,這將產生與日期比較非常不同的結果。可以解釋你爲什麼得到錯誤的結果。

試着改變你的數據庫查詢返回,而不是一個字符串日期時間值:

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

更新:

另一種選擇是投值作爲你的環比一個DATE。這將迫使QoQ執行日期比較,而不是字符串比較:

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

感謝您的評論。我想到了。請閱讀我上面的評論:) – Tan

+0

感謝您提及'STR_TO_DATE'功能。 :) – Tan