请考虑以下代码(在我之前的帖子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)
。是吗 会造成任何问题吗?
答案 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>
也照顾到了这个问题。