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

MySQLSelect過去7日間

    WHERE 句が間違って配置されているため、テーブル参照とJOIN操作に従う必要があります。

    このようなもの:

     FROM tartikel p1 
     JOIN tartikelpict p2 
       ON p1.kArtikel = p2.kArtikel 
      AND p2.nNr = 1
    WHERE p1.dErstellt >= DATE(NOW()) - INTERVAL 7 DAY
    ORDER BY p1.kArtikel DESC
    

    編集 (3年以上後)

    上記は基本的に、「クエリにWHERE句を追加しようとしましたが、クエリがエラーを返します。どうすれば修正できますか?」という質問に答えます。

    「過去7日間」の日付範囲をチェックする条件の記述に関する質問について...

    これは、仕様の解釈、テーブル内の列のデータ型(DATEまたはDATETIME)、および使用可能なデータ...何を返すかによって異なります。

    要約すると、一般的なアプローチは、日付/日時範囲の「開始」とその範囲の「終了」を識別し、クエリでそれらを参照することです。もっと簡単なことを考えてみましょう...「昨日」のすべての行。

    列がDATE型の場合。式をクエリに組み込む前に、単純なSELECT

    で式をテストできます。
     SELECT DATE(NOW()) + INTERVAL -1 DAY 
    

    返された結果が期待どおりであることを確認します。次に、同じ式をWHERE句で使用して、次のようなDATE列と比較できます。

     WHERE datecol = DATE(NOW()) + INTERVAL -1 DAY
    

    DATETIME列またはTIMESTAMP列には、>=を使用できます。 および< 範囲を指定するための不等式の比較

     WHERE datetimecol >= DATE(NOW()) + INTERVAL -1 DAY
       AND datetimecol <  DATE(NOW()) + INTERVAL  0 DAY
    

    「過去7日間」については、それが今この時点から7日間前に戻ったことを意味するかどうかを知る必要があります...例:過去7*24時間、比較の時間コンポーネントを含む、...

     WHERE datetimecol >= NOW() + INTERVAL -7 DAY
       AND datetimecol <  NOW() + INTERVAL  0 DAY
    

    今日を除く過去7日間

     WHERE datetimecol >= DATE(NOW()) + INTERVAL -7 DAY
       AND datetimecol <  DATE(NOW()) + INTERVAL  0 DAY
    

    または過去6日間と今日までのところ...

     WHERE datetimecol >= DATE(NOW()) + INTERVAL -6 DAY
       AND datetimecol <  NOW()       + INTERVAL  0 DAY
    

    SELECTステートメントの右側の式をテストすることをお勧めします。テストにはNOW()の代わりにユーザー定義変数を使用できます。NOW()が返すものに縛られることなく、週/月にわたって境界をテストできます。 /年の境界など。

    SET @clock = '2017-11-17 11:47:47' ;
    
    SELECT DATE(@clock)
         , DATE(@clock) + INTERVAL -7 DAY 
         , @clock + INTERVAL -6 DAY 
    

    特定のユースケース(「過去7日間」の意味)で「開始」と「終了」に機能する値を返す式ができたら、WHERE句の範囲比較でこれらの式を使用できます。

    (一部の開発者は、DATE_ADDを使用することを好みます およびDATE_SUB + INTERVAL val DAY/HOUR/MINUTE/MONTH/YEARの代わりに機能します 構文。

    また、MySQLには、DATE、DATETIME、およびTIMESTAMPデータ型を操作するための便利な関数がいくつか用意されています... DATE、LAST_DAY、

    一部の開発者は、他のコードで開始と終了を計算し、データベースに送信されるクエリが

    になるようにSQLクエリで文字列リテラルを提供することを好みます。
      WHERE datetimecol >= '2017-11-10 00:00'
        AND datetimecol <  '2017-11-17 00:00'
    

    そして、そのアプローチも機能します。 (私の好みは、CAST、CONVERT、または+ INTERVALトリックのいずれかを使用して、これらの文字列リテラルをDATETIMEに明示的にキャストすることです...

      WHERE datetimecol >= '2017-11-10 00:00' + INTERVAL 0 SECOND
        AND datetimecol <  '2017-11-17 00:00' + INTERVAL 0 SECOND
    

    上記はすべて、「日付」を適切なDATE、DATETIME、および/またはTIMESTAMPデータ型で格納し、さまざまな形式の文字列として格納しないことを前提としています。 'dd/mm/yyyy'm/d/yyyy 、ジュリアンの日付、または散発的に非正規の形式で、またはエポックの開始からの秒数として、この回答ははるかに長くする必要があります。



    1. 条件を使用してクエリを選択します

    2. MySQLエラーメッセージ言語を変更する

    3. mySQLSELECTの今後の誕生日

    4. golangの行数を数える