2013-01-23 83 views
2

我在MySQL表中有一個timestamp字段。我嘗試使用下面的SQL查詢來查詢該表:MySQL和Coldfusion日期問題

SELECT login_mode,count(login_mode) as total 
FROM login_activity,ccac_registered_users 
WHERE login_activity.student_id=ccac_registered_users.student_id 
AND  login_date >= STR_TO_DATE('01/16/2013','%m/%d/%Y') 
AND  login_date <= STR_TO_DATE('01/17/2013','%m/%d/%Y') 
GROUP BY login_mode 

的查詢工作正常,當我直接在MySQL運行它,但不從ColdFusion的應用工作。我很難過!生成日期的代碼是:

login_date >= STR_TO_DATE(
       '#DateFormat(CreateODBCDate(startDate),'mm/dd/yyyy')#' 
       , '%m/%d/%Y' 
      ) 

而且從ColdFusion的錯誤是這樣的:

您的SQL語法錯誤;請檢查 對應於您的MySQL服務器版本的手冊,在'01/16/2013',''%m /%d /%Y''附近使用 ')AND login_date < = STR_TO_DATE('' 2013年1月17日 '', '' %M /%d /」在行1

這裏有什麼問題?

編輯

我只是把這段SQL認爲CF是試圖執行。

SELECT login_mode,count(login_mode) as total 
FROM login_activity,ccac_registered_users 
WHERE login_activity.student_id=ccac_registered_users.student_id 
AND login_date >= STR_TO_DATE(''01/16/2013'',''%m/%d/%Y'') 
AND login_date <= STR_TO_DATE(''01/17/2013'',''%m/%d/%Y'') 

日期還有其他引號,它們引起了問題。如果我刪除了從代碼中添加的額外代碼,則不會添加任何內容。

+0

@Leigh引用不會丟失。它在pamentalhesis的結尾。我會嘗試使用CreateODBCDate。 AFAIK,當我最後一次嘗試時,它不能與mysql一起工作。 –

+0

哦,是的,你是對的。我的眼睛錯過了一個報價。 – Leigh

+1

你可能也想看看在你的查詢中使用BETWEEN。 –

回答

1

CFQUERY喜歡自動轉義單引號。爲了讓它按照你寫的方式工作,你需要用preserveSingleQuotes()來包裝東西,以防止CF增加額外的單引號。或者用日期比較中的其他建議重寫它。

+0

這工作!謝謝! –

+0

它是因爲我已經使用MySQL的一段時間,但如果你可以將參數傳遞給使用雙引號的功能,這將完全避免的問題: 'STR_TO_DATE(「#日期格式(CreateODBCDate(的startDate),」MM/DD/yyyy')#「,」%m /%d /%Y「)' – imthepitts

+0

該查詢正在動態生成,並且已包含在雙引號中,因此使用了單引號。 –

1

我建議用DATEDIFF來執行日期comparaisons而不是字符串比較日期,工作真的很好我的應用程序的4

細節在這裏:http://www.w3schools.com/sql/func_datediff_mysql.asp

+3

我不同意。在where子句中使用函數通常會使查詢運行速度變慢。如果有問題的字段被編入索引,情況尤其如此。 –

1

在SQL使用:

CONVERT(DateTime, DateField, 104) 

或嘗試:

CAST(right(@date,4) + left(@date,4) as datetime) 

我以爲ColdFu sion相當於:

<cfset date = DateFormat(date, "mm/dd/yyyy")> 

- no?

+0

DateFormat不適用於字符串,需要日期/時間對象。 –

+0

啊,謝謝澄清。 –

+2

@VaishakSuresh - 它是專爲*日期*是。但是與CF中的大多數日期函數一樣,它也會接受「可解析」的日期字符串。請注意,它始終被解釋爲美國的日期字符串。 – Leigh

4

使用queryparameters和dateobjects而不是字符串。就像這樣:

AND login_date >= <cfqueryparam cfsqltype="cf_sql_date" value="#CreateDate(2013,1,16)#"> 
AND login_date <= <cfqueryparam cfsqltype="cf_sql_date" value="#CreateDate(2013,1,17)#"> 
+0

Upvoted丹的,因爲他用代碼示例擊敗了我! :) – BKK

7

(從我先前的評論...)

應該有完全沒有必要使用dateFormatstr_to_dateDateFormat是爲演示文稿設計的,並返回字符串。你應該使用什麼是日期對象。 CreateODBCDate已經給你。所以只需在查詢中直接使用它。 (顯然你應該總是首先驗證輸入)

WHERE column >= #CreateODBCDate(startDate)# 
.... 

..或更好的是,使用cfqueryparam:

WHERE column >= <cfqueryparam cfsqltype="cf_sql_date" value="#startDate#">