2012-03-07 49 views
1

我试图在SQL中使用BETWEEN运算符在特定日期之间获取订单。在日期SQL和Coldfusion中使用BETWEEN

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

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

我认为这会从01/03/2012返回所有订单(包括01/03/2012)至2012年3月7日(包括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

日期是否有时间分量?如果结束日期有时间分量,比如07/03/2012 03:00:12,那么它将不匹配。另外,你的代码中有一个错字:“” – 2012-03-07 12:46:45

+0

@Jason - 你确定DateFormat(..,“dd/mm/yyyy”)>真的在做你认为的事情吗? DateFormat(和createODBCDate)始终假定* input *是美国日期格式。 – Leigh 2012-03-07 16:19:05

回答

4

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

我通常使用日期打交道时,做这样的事情:

如果我想从我1/1/2012成立开始日期为1/1/2012一切,结束日期晚一天(午夜)...

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等

+0

嗨,这工作,我添加了一个额外的一天到目前为止,它现在返回正确的结果 ' ' – 2012-03-07 13:10:49

+1

确保在这种方式下不使用'BETWEEN',因为这是包容性的,会给你与午夜结束日期相匹配的日期。 – 2012-03-07 14:43:12

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)#">) 
+0

不确定日期函数与我的数据库SQL 2008? – 2012-03-07 13:09:40

+0

是的,DATE()与2008一起工作。 – 2012-03-07 13:33:30

+0

虽然净效果与使用'> = ..和.. <'相同,请记住使用列上的函数有时可能会阻止使用索引。 – Leigh 2012-03-08 17:21:15

1

这取决于你正在使用的数据库,并没有指定哪一个你是,但很多人不认为BETWEEN是包容性的。

我通常只用>=<=两个条款。它的效率可能也可能不是那么低,但我明确知道我测试的是什么。

+0

回复:*但很多人不把'BETWEEN'当作包容性的*只是好奇,哪些数据库? IIRC标准将BETWEEN定义为包容性的,最近的标准。 – Leigh 2012-03-08 17:24:41

+0

我不记得,因为我只读过关于它的文章或者从其他开发者那里听说过它。 – 2012-03-08 17:43:30

+0

奇怪。我用过的所有东西(sybase,mySQL,ms sql,oracle,..)都是独占的。也许他们正在考虑更老的数据库或不同的运营商?如果你确实遇到过一篇参考文章,我很想知道哪个数据库能够达到标准;) – Leigh 2012-03-08 18:46:16