Sam*_*len 3 sql coldfusion sql-server-2012
我有一个页面,我想运行一些关于使用ColdFusion和SQL Server数据库的报告.
这是我的表格:
<cfform name="dateRange" action="" method="POST">
<label>Date From</label><br>
<cfinput type="DateField" name="dFrom" mask="DD/MM/YYYY">
<label>Date To</label><br>
<cfinput type="DateField" name="dTo" mask="DD/MM/YYYY">
<cfinput type="submit" value="Submit" name="Submit">
</cfform>
<hr>
<cfif isDefined("form.submit")>
<cfinclude template="data-p.cfm">
</cfif>
Run Code Online (Sandbox Code Playgroud)
data-p.cfm文件如下所示:
<cfset fromDate = #CREATEODBCDATETIME(#form.dFrom#)#>
<cfset toDate = #CREATEODBCDATETIME(#form.dTo#)#>
<cfquery name="t">
SELECT id, type, started
FROM t_users
WHERE started >= #fromDate#
AND started <= #toDate#
ORDER BY started
</cfquery>
<cfdump var="#t#">
Run Code Online (Sandbox Code Playgroud)
但问题是它会转储所有记录并且不应用日期过滤器.当我转储查询时,它会转储数据库中的所有记录.即使SQL转储声明,它也会忽略WHERE语句:
SELECT id, type, started
FROM t_users
WHERE started >= {ts '2017-01-06 00:00:00'}
AND started <= {ts '2017-08-06 00:00:00'}
ORDER BY started
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?
它会转储所有记录,但不会应用日期过滤器.
它确实应用了日期过滤器.这不是你期望的那个.
我怀疑你试图找到日期为2017年6月1日至6月8日的记录.但是,如果仔细观察生成的sql,它实际上是在2017年1月6日至8月6日过滤.
where started >= {ts '2017-01-06 00:00:00'} and started <= {ts '2017-08-06 00:00:00'}
原因是标准CF日期函数仅了解美国日期约定,即月份优先.因此,当您传入像"01/06/2017"这样的字符串时,它将被解释为1月 6日 - 而不是6月1日.要正确处理非美国日期字符串,要么
使用区域设置敏感函数,例如LSParseDateTime()(使用适当的语言环境).例如:
<cfset form.dFrom = "01/06/2017">
<cfset writeDump( LSParseDateTime(form.dFrom, "de_DE") )>
Run Code Online (Sandbox Code Playgroud)或者对于数字日期,请使用具有适当掩码的ParseDateTime():
<cfset form.dFrom = "01/06/2017">
<cfset writeDump( ParseDateTime(form.dFrom, "dd/MM/yyyy") )>
Run Code Online (Sandbox Code Playgroud)请记住,CF的日期函数在他们认为有效的日期字符串中非常慷慨,因此您可能需要添加一些额外的验证.
此外,出于性能原因,请始终对任何变量查询参数使用cfqueryparam.更灵活的日期比较方法是:
WHERE started >= <cfqueryparam value="#someStartDate#" cfsqltype="cf_sql_date">
AND started < <cfqueryparam value="#dateAdd('d', 1, someEndDate)#" cfsqltype="cf_sql_date">
Run Code Online (Sandbox Code Playgroud)