2012-03-07 50 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