sql >> データベース >  >> RDS >> Mysql

日付形式とSQLクエリの説明

    それは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式とまったく同じ結果が生成されます。



    1. MySQLトランザクションをテストする方法は?

    2. iOSアプリでMySQLデータベースに接続する

    3. NullPointerException-データベースからデータを取得して配列に格納する際のデータベースロックの問題

    4. マルチテナントmysqlデータベースを設計する方法