0

请考虑以下代码(在我之前的线程Playing around with date range in ColdFusion 8的上下文中)。

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


<cfinput type="dateField" name="startdate" label="Start Date" width="100" value="#Form.startdate#">
<cfinput type="dateField" name="enddate" label="End Date" width="100" value="#Form.enddate#">
<cfinput name="submit" type="submit" value = "Apply">
<cfinput name="cancel" type="submit" value="Download CSV">

我有以下问题:

1)当用户从日历中选择一个日期(开始日期)时,日期是否会自动传递到下一行的“值”字段?

 <cfinput type="dateField" name="startdate" label="Start Date" width="100" value="#Form.startdate#">

如果上述情况属实,那么我相信同样的事情也适用于结束日期。

2)关于SQL查询:

假设我正在编写以下查询(请注意,“UpdatedDate”是我将从中提取“startdate”和“enddate”的列的名称:

             <cfquery datasource = "XX.XX.X.XX" name="qMyDatabase">
            SELECT(SELECT count(*) FROM MyDatabase) AS TOTAL_CONNECTIONS,
            (SELECT count(*) FROM MyDatabase WHERE event_vc = "OPEN" AND UpdatedDate BETWEEN #Form.startdate# AND #Form.enddate#  ) AS OPEN_CONNECTIONS,
            (SELECT count(*)FROM MyDatabase WHERE event_vc = "BOUNCE"    AND  UpdatedDate    BETWEEN #Form.startdate# AND #Form.enddate#) AS BOUNCE_CONNECTIONS,
            (SELECT count(*) from MyDatabase where event_vc = "DEFERRED" AND  UpdatedDate    BETWEEN #Form.startdate# AND #Form.enddate#) AS DEFERRED_CONNECTIONS,
            (SELECT count(*) from MyDatabase where event_vc = "DELIVERED" AND UpdatedDate    BETWEEN #Form.startdate# AND #Form.enddate#) AS DELIVERED_CONNECTIONS,
            (SELECT count(*) from MyDatabase where event_vc = "DROPPED"  AND  UpdatedDate    BETWEEN #Form.startdate# AND #Form.enddate#) AS DROPPED_CONNECTIONS,
            (SELECT count(*) from MyDatabase where event_vc = "PROCESSED" AND UpdatedDate    BETWEEN #Form.startdate# AND #Form.enddate#) AS PROCESSED_CONNECTIONS,
(ROUND((SELECT OPEN_CONNECTIONS / (TOTAL_CONNECTIONS))*100)) AS "OPEN",
(ROUND((SELECT DEFERRED_CONNECTIONS / (TOTAL_CONNECTIONS))*100)) AS "DEFERRED",
(ROUND((SELECT DELIVERED_CONNECTIONS / (TOTAL_CONNECTIONS))*100)) AS "DELIVERED", (ROUND((SELECT DROPPED_CONNECTIONS / (TOTAL_CONNECTIONS))*100)) AS "DROPPED", (ROUND((SELECT PROCESSED_CONNECTIONS / (TOTAL_CONNECTIONS))*100)) AS "PROCESSED";
 </cfquery>

请让我知道上述查询是否正确?

3)关于日期格式。

如上所述,我正在使用面具

月/日/年

上面,而我数据库中的列(UpdatedDate)使用不同的格式

(YYYY/MM/DD HH:MI:SS)

. 它会产生任何问题吗?

4

2 回答 2

1

这是一个线程的很多问题..但我会尝试解决其中的大部分问题。(您可以自己回答的第一个问题,只需尝试一下 ;-)

至于查询,即使它没有错误地运行 - 它也可以改进。我不会为您重写查询,但这里是主要问题

  • 首先,永远不要在 SQL 中直接使用原始客户端值。始终用于cfqueryparam防止 sql 注入。它还有其他好处,但在 Web 应用程序中是至关重要的。

  • 其次,您正在传递日期字符串。日期字符串不明确,可能会被误解,具体取决于进行解析的格式和工具。改用日期对象要好得多。一种方法是使用cfqueryparam和其中一种日期类型:(cf_sql_date仅限日期)或cf_sql_timestamp(日期和时间)。

  • 第三,正如我在你的另一个线程中提到的,你真的需要简化你的查询!这么多子查询已经很笨拙了.. 为每个子查询添加日期过滤器使其完全无法管理。我建议寻找简化它的方法。Ed 的建议提供了一种可能性,将其减少为单个JOIN和几个函数调用。

列 (UpdatedDate) 使用YYYY/MM/DD HH:MI:SS

实际上,这正是您的 IDE向人类展示它的方式。它并没有真正以这种方式存储。在内部,日期存储为大数字。但是,您的查询确实需要考虑您的列存储日期时间的事实。

假设您要检索 6 月份的所有记录

    form.startDate = "06/01/2013"
    form.endDate = "06/30/2013"

从概念上讲,您需要这样的 sql 表达式:

    WHERE column BETWEEN '06/01/2013 at midnight' AND '06/30/2013 11:59:59 PM' 

但是,构建这些日期/时间值有点笨拙。一种更简单的处理方法是使用此范例:

   WHERE column >= {startDateAtMidnight}        
   AND   column <  {dayAfterEndDateAtMidnight}

您的实际查询过滤器将如下所示:

    WHERE column >= <cfqueryparam value="#form.startDate#" 
                                  cfsqltype="cf_sql_date">
    AND   column <  <cfqueryparam value="#dateAdd('d', 1, form.endDate)#" 
                                  cfsqltype="cf_sql_date">

通过向 中添加一天form.endDate并使用<比较,得到的查询是:

    WHERE column >= '2013-06-01 00:00:00'  
    AND   column < '2013-07-01 00:00:00'  

这将产生与前面的 BETWEEN 表达式完全相同的结果。

于 2013-07-10T17:36:52.507 回答
0

第 0 部分)。看起来您正在执行 dateAdd() 操作。提交按钮不需要在<cfinput>

第1部分)。标签<cfinput>仅适用于 Flash 表单?如果您使用的 Flash 表单应该是问题的一部分

第2部分)。此代码对 SQL 注入攻击开放。利用<cfqueryparam>

第 3 部分)。<cfqueryparam>也照顾到这个问题。

于 2013-07-10T16:14:17.860 回答