查询2个日期之间的记录

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)

有任何想法吗?

Lei*_*igh 6

它会转储所有记录,但不会应用日期过滤器.

确实应用了日期过滤器.这不是你期望的那个.

我怀疑你试图找到日期为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日.要正确处理非美国日期字符串,要么

请记住,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)