日期格式和SQL查询说明

时间:2013-07-10 15:54:14

标签: mysql coldfusion coldfusion-8

请考虑以下代码(在我之前的帖子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”的列的名称,    “结束日期”:

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

。是吗 会造成任何问题吗?

2 个答案:

答案 0 :(得分:1)

对于一个帖子来说,这是很多问题..但我会尝试解决其中的大多数问题。 (你可以自己回答第一个问题,只需要尝试一下; - )

就查询而言,即使它运行没有错误 - 它也可以改进。我不会为你重写查询,但这是主要问题

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

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

  • 第三,正如我在your other thread上提到的,你真的需要简化你的查询!那么多子查询已经很笨拙了。为每个子查询添加日期过滤器使得它完全无法管理。我建议寻找简化它的方法。 Ed's suggestion通过将其缩减为单个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' 

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

   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表达式完全相同的结果。

答案 1 :(得分:0)

第0部分)。看起来你正在做一个dateAdd()操作。提交按钮不需要位于<cfinput>

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

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

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