それは1つのスレッドに対する多くの質問です..しかし、私はそれらのほとんどに対処しようとします。 (試してみるだけで、自分で答えられる最初の質問;-)
クエリに関しては、エラーなしで実行された場合でも、改善することができます。クエリを書き直すつもりはありませんが、主な問題は次のとおりです
-
まず、決して SQLで直接生のクライアント値を使用します。常に
cfqueryparam
を使用してください SQLインジェクションから保護します。他の利点もありますが、それはWebアプリケーションでは重要です。 -
次に、日付文字列を渡します 。日付文字列はあいまいであり、解析を実行する形式とツールによっては、誤って解釈される可能性があります。日付オブジェクトを使用する方がはるかに優れています 代わりは。これを行う1つの方法は、
cfqueryparam
を使用することです。 および日付タイプの1つ:cf_sql_date
(日付のみ)またはcf_sql_timestamp
(日時)。 -
第三に、他のスレッドで述べたように 、あなたは本当にあなたのクエリを単純化する必要があります!その多くのサブクエリはすでに扱いにくいです..各サブクエリに日付フィルタを追加すると、それはまったく管理できなくなります。私はそれを単純化する方法を検討することをお勧めします。 Edの提案 それを単一の
JOIN
に減らすことによって、1つの可能性を提供しました といくつかの関数呼び出し。
実際、これがIDEの表示の方法です。 人間にそれ。実際にはそのように保存されていません。内部的には、日付は大きな数値として格納されます。ただし、クエリでは、列に日付が格納されているという事実を考慮する必要があります 時間。
日付のすべてのレコードを取得したいとします。 6月:
form.startDate = "06/01/2013"
form.endDate = "06/30/2013"
概念的には、次のようなSQL式が必要になります。
WHERE column BETWEEN '06/01/2013 at midnight' AND '06/30/2013 11:59:59 PM'
ただし、これらの日付/時刻の値を作成するのは少し厄介なIMOです。これを処理する簡単な方法は、次のパラダイムを使用することです。
WHERE column >= {startDateAtMidnight}
AND column < {dayAfterEndDateAtMidnight}
実際のクエリフィルタは次のようになります:
WHERE column >= <cfqueryparam value="#form.startDate#"
cfsqltype="cf_sql_date">
AND column < <cfqueryparam value="#dateAdd('d', 1, form.endDate)#"
cfsqltype="cf_sql_date">
form.endDate
に1日を追加する 、および<
を使用する 比較すると、結果のクエリは次のようになります。
WHERE column >= '2013-06-01 00:00:00'
AND column < '2013-07-01 00:00:00'
これにより、以前のBETWEEN式とまったく同じ結果が生成されます。