2

timestamp在 MySQL 表中有一个字段。我正在尝试使用以下 SQL 查询来查询表:

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 上运行时,查询工作正常,但在冷融合应用程序中不起作用。我难住了!生成日期的代码是:

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(''01/17 /2013'',''%m/%d/' 在第 1 行

这里有什么问题?

编辑

我刚刚转储了 CF 试图执行的 sql。

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

日期周围还有其他报价,它们导致了问题。如果我删除了从代码中添加的额外内容,则不会添加任何内容。

4

5 回答 5

7

(来自我之前的评论......)

绝对不需要使用dateFormator str_to_dateDateFormat专为演示而设计并返回一个字符串。您应该使用的是日期对象。CreateODBCDate已经给你了。因此,只需在您的查询中直接使用它。(显然你应该总是先验证输入)

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

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

 WHERE column >= <cfqueryparam cfsqltype="cf_sql_date" value="#startDate#">
于 2013-01-23T19:59:12.437 回答
4

使用查询参数和日期对象而不是字符串。像这样:

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)#">
于 2013-01-23T19:56:27.657 回答
1

我建议使用 DateDIff 来执行日期比较,而不是比较字符串中的日期,这对我的 4 个应用程序非常有效

详情在这里:http ://www.w3schools.com/sql/func_datediff_mysql.asp

于 2013-01-23T19:42:23.713 回答
1

在 SQL 中使用:

    CONVERT(DateTime, DateField, 104)

或尝试:

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

我认为 ColdFusion 等价物是:

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

- 不?

于 2013-01-23T19:43:41.643 回答
1

CFQUERY 喜欢自动转义单引号。为了让它按照您编写的方式工作,您需要将内容包装起来preserveSingleQuotes()以防止 CF 添加额外的单引号。或者使用其他日期比较建议之一重写它。

于 2013-01-23T20:09:15.023 回答