2012-03-07 24 views
1

SQLのBETWEEN演算子を使用して、特定の日付の間に注文を取得しようとしています。BETWEENを日付SQLとColdfusionで使用する

私の日付の形式は、dd/mm/yyyy形式です。

ord_fdate日付からである。現在、2012年1月3日
ord_tdateは最新です:現在、2012年7月3日

私は、これは(01を含む2012年1月3日からすべての注文を返すだろうと思いました/ 03/2012)から2012年7月3日まで(2012年7月3日を含む)。

しかし、それは日付2012年7月3日

以下の私のクエリでの受注を得ることはありません。私は、クエリのデバッグ出力も含めました。

<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」などの時間要素がある場合、それは一致しません。 "" –

+0

@Jason - あなたは確かですか?DateFormat(..、 "dd/mm/yyyy")>あなたが思っていることを本当にやっているのですか? DateFormat(およびcreateODBCDate)は、*入力*が常に米国の日付形式であると仮定します。 – Leigh

答えて

4

あなたの日付フィールドには時間が含まれていますか?そうであれば、その間に最初の日付> =と、深夜の2番目の日付である< =の値が与えられます。深夜0時を含む日付は無視されます。日付を扱うとき

は、私は通常、このような何かを:

私は2012年1月1日と開始日を設定し2012年1月1日からすべてをしたい場合は、1日後などの終了日...(深夜)

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

は次のような値を選択します。

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

終了日と照合私は終了日よりも少ない値を使って何をしたいです。これは、それがどのデータベースを使っているかによって異なり、あなたはどちらを指定しなかったな2012年1月1日12時30分などの値、2012年1月1日午後11時20分、など

+0

こんにちはこれはうまくいきました。今日まで余分な日を追加しましたが、今は正しい結果を返しています。 ' ' –

+1

このようにするときは、BETWEENを使用しないでください。あなたが深夜に終了日に一致する日付を与えるでしょう。 –

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

日付機能がデータベース2008 SQLで動作しているかどうかわかりませんか? –

+0

DATE()は2008年に動作します。 –

+0

ネットの効果は、 '> = ..と.. <'を使うのと同じですが、列の関数を使うことを覚えておくと、インデックスの使用を妨げることがあります。 – Leigh

1

が含まれますあなたはそうですが、多くはBETWEENを包括的として扱っていません。

私は通常、>=<=の2つの節を使用します。それはあまり効率的ではないかもしれませんが、具体的に私が何に対してテストしているかは分かります。

+0

Re:*しかし、多くは包括的であるとしてBETWEENを扱いません。 IIRCは、包括的で最近のものをとにかく定義しています。 – Leigh

+0

私はそれについての記事を読んだり、他の開発者から聞いたことがあるので、私は手を覚えていません。 –

+0

奇妙な。私が使用したもの(sybase、mySQL、ms sql、oracle、..)は排他的です。たぶん彼らは古いDBや別の演算子を考えていたでしょうか?あなたがリファレンスを投稿した場合は、それを投稿してください。私はどのデータベースの勘定基準を知ることに興味があるだろう;) – Leigh

関連する問題