使用BETWEEN与日期SQL和Coldfusion

时间:2012-03-07 12:37:37

标签: sql coldfusion

我正在尝试使用SQL中的BETWEEN运算符在某些日期之间获取订单。

我的日期格式为dd / mm / yyyy格式。

ord_fdate是起始日期:目前01/03/2012
ord_tdate是迄今为止:目前是07/03/2012

我认为这将从2012年3月1日(包括01/03/2012)到2012年3月3日(包括07/03/2012)返回所有订单。

但是,它没有获得日期为07/03/2012的订单

我的查询如下;我还包括了查询的调试输出;

<cfset ord_fdate = DateFormat(ord_fdate, "dd/mm/yyyy")>
<cfset ord_tdate = DateFormat(ord_tdate, "dd/mm/yyyy")>
<cfquery name="getOrders" datasource="#application.dsn#">
SELECT 
  dbo.tbl_orders.uid_orders,
  dbo.tbl_orders.dte_order_stamp

FROM
  dbo.tbl_orders
  WHERE dbo.tbl_orders.uid_order_webid=<cfqueryparam cfsqltype="cf_sql_integer" value="#session.webid#">
  AND bit_order_archive=<cfqueryparam cfsqltype="cf_sql_bit" value="no">
  AND txt_order_status=<cfqueryparam cfsqltype="cf_sql_varchar" value="Awaiting Dispatch">
  AND dte_order_stamp BETWEEN <cfqueryparam cfsqltype="cf_sql_date" value="#createODBCDate(ord_fdate)#"> AND <cfqueryparam cfsqltype="cf_sql_date" value="#createODBCDate(ord_tdate)#">
  ORDER BY dte_order_stamp DESC
</cfquery>

调试;

WHERE (dbo.tbl_orders.uid_order_webid=?
  AND bit_order_archive=?
  AND txt_order_status=?
  AND dte_order_stamp BETWEEN ? AND ?)


  ORDER BY dte_order_stamp DESC
Query Parameter Value(s) -
Parameter #1(cf_sql_integer) = 1
Parameter #2(cf_sql_bit) = NO
Parameter #3(cf_sql_varchar) = Awaiting Dispatch
Parameter #4(cf_sql_date) = {ts '2012-03-01 00:00:00'}
Parameter #5(cf_sql_date) = {ts '2012-03-07 00:00:00'}

不确定为什么它不起作用。

数据库是SQL 2008

有什么想法吗?

3 个答案:

答案 0 :(得分:4)

您的日期字段是否包含时间?如果是这样,两者之间只会给你值&gt; =第一个日期,而&lt; =午夜的第二个日期。任何包含午夜时间的日期都将被忽略。

在处理日期时,我通常会这样做:

如果我想要从2012年1月1日起的所有内容,我将开始日期设置为2012年1月1日,将结束日期设置为一天后(午夜)......

declare @StartDate datetime = '01/01/2012'
declare @EndDate datetime = '01/02/2012'

然后选择如下的值:

select * from your_table where date >= @StartDate and date < @EndDate

在检查结束日期时,我想要任何值小于结束日期的东西。这将包括诸如1/1/2012 12:30,1 / 1/2012 23:20等的值

答案 1 :(得分:1)

AND (DATE(dte_order_stamp) >= <cfqueryparam cfsqltype="cf_sql_date" value="#createODBCDate(ord_fdate)#">),
AND (DATE(dte_order_stamp) <= <cfqueryparam cfsqltype="cf_sql_date" value="#createODBCDate(ord_tdate)#">)

答案 2 :(得分:1)

这取决于您使用的是哪个数据库,而您没有指定自己的数据库,但很多数据库并未将BETWEEN视为具有包容性。

我通常只使用>=<=两个子句。效率可能会降低,也可能不会降低效率,但我特别知道我正在测试的是什么。