0

次のコードを検討してください (以前のスレッドPlaying around with date range in ColdFusion 8のコンテキストで)。

<cfparam name="Form.startdate" default="#dateformat(now()-5, 'mm/dd/yyyy')#">
<cfparam name="Form.enddate" default="#dateformat(now()-1, 'mm/dd/yyyy')#">
<cfparam name="Form.selectdate" default="#dateformat(now(), 'mm/dd/yyyy')#">


<cfinput type="dateField" name="startdate" label="Start Date" width="100" value="#Form.startdate#">
<cfinput type="dateField" name="enddate" label="End Date" width="100" value="#Form.enddate#">
<cfinput name="submit" type="submit" value = "Apply">
<cfinput name="cancel" type="submit" value="Download CSV">

次の質問があります。

1) ユーザーがカレンダーから日付 (開始日) を選択すると、日付は次の行の「値」フィールドに自動的に渡されますか?

 <cfinput type="dateField" name="startdate" label="Start Date" width="100" value="#Form.startdate#">

上記が当てはまる場合、終了日にも同じことが当てはまると思います。

2) SQL クエリについて:

次のクエリを書いているとします (「UpdatedDate」は、「開始日」と「終了日」を取得する列の名前であることに注意してください。

             <cfquery datasource = "XX.XX.X.XX" name="qMyDatabase">
            SELECT(SELECT count(*) FROM MyDatabase) AS TOTAL_CONNECTIONS,
            (SELECT count(*) FROM MyDatabase WHERE event_vc = "OPEN" AND UpdatedDate BETWEEN #Form.startdate# AND #Form.enddate#  ) AS OPEN_CONNECTIONS,
            (SELECT count(*)FROM MyDatabase WHERE event_vc = "BOUNCE"    AND  UpdatedDate    BETWEEN #Form.startdate# AND #Form.enddate#) AS BOUNCE_CONNECTIONS,
            (SELECT count(*) from MyDatabase where event_vc = "DEFERRED" AND  UpdatedDate    BETWEEN #Form.startdate# AND #Form.enddate#) AS DEFERRED_CONNECTIONS,
            (SELECT count(*) from MyDatabase where event_vc = "DELIVERED" AND UpdatedDate    BETWEEN #Form.startdate# AND #Form.enddate#) AS DELIVERED_CONNECTIONS,
            (SELECT count(*) from MyDatabase where event_vc = "DROPPED"  AND  UpdatedDate    BETWEEN #Form.startdate# AND #Form.enddate#) AS DROPPED_CONNECTIONS,
            (SELECT count(*) from MyDatabase where event_vc = "PROCESSED" AND UpdatedDate    BETWEEN #Form.startdate# AND #Form.enddate#) AS PROCESSED_CONNECTIONS,
(ROUND((SELECT OPEN_CONNECTIONS / (TOTAL_CONNECTIONS))*100)) AS "OPEN",
(ROUND((SELECT DEFERRED_CONNECTIONS / (TOTAL_CONNECTIONS))*100)) AS "DEFERRED",
(ROUND((SELECT DELIVERED_CONNECTIONS / (TOTAL_CONNECTIONS))*100)) AS "DELIVERED", (ROUND((SELECT DROPPED_CONNECTIONS / (TOTAL_CONNECTIONS))*100)) AS "DROPPED", (ROUND((SELECT PROCESSED_CONNECTIONS / (TOTAL_CONNECTIONS))*100)) AS "PROCESSED";
 </cfquery>

上記のクエリが正しいと思われるかどうか教えてください。

3) 日付形式について。

前述のように、私はマスクを使用しています

mm/dd/yyyy

上記、データベースの列(UpdatedDate)は異なる形式を使用していますが

(YYYY/MM/DD HH:MI:SS)

. 問題が発生することはありますか?

4

2 に答える 2

1

それは 1 つのスレッドに対する多くの質問です..しかし、私はそれらのほとんどに対処しようとします。(試してみるだけで、自分で答えられる最初の質問 ;-)

クエリに関しては、エラーなしで実行されたとしても、改善することができます。クエリを書き直すつもりはありませんが、主な問題は次のとおりです。

  • まず、生のクライアント値を SQL で直接使用しないでください。cfqueryparamSQL インジェクションから保護するために常に使用します。他にも利点がありますが、これは Web アプリケーションでは重要です。

  • 次に、日付文字列を渡しています。日付文字列はあいまいで、解析を行う形式とツールによっては、誤解される可能性があります。代わりに日付オブジェクトを使用することをお勧めします。これを行う 1 つの方法は、(日付のみ) または(日付と時刻)のいずれかcfqueryparamの日付タイプを使用することです。cf_sql_datecf_sql_timestamp

  • 第三に、他のスレッドで述べたように、クエリを単純化する必要があります。その多くのサブクエリはすでに扱いにくい..各サブクエリに日付フィルターを追加すると、まったく管理が難しくなります。単純化する方法を検討することをお勧めします。Ed の提案JOINは、関数呼び出しを 1 回と数回に減らすことで、1 つの可能性を提供しました。

列 (UpdatedDate) が使用するYYYY/MM/DD HH:MI:SS

実際、それは 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">

に 1 日を追加form.endDateして<比較すると、結果のクエリは次のようになります。

    WHERE column >= '2013-06-01 00:00:00'  
    AND   column < '2013-07-01 00:00:00'  

これにより、以前の BETWEEN 式とまったく同じ結果が生成されます。

于 2013-07-10T17:36:52.507 に答える