我正在尝试使用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
有什么想法吗?
答案 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
视为具有包容性。
我通常只使用>=
和<=
两个子句。效率可能会降低,也可能不会降低效率,但我特别知道我正在测试的是什么。