web-dev-qa-db-ja.com

MySQL Select過去7日間

ここでいくつかの投稿を読みましたが、特別なものではないようですが、最後の日のエントリを選択することはできません。

SELECT 
    p1.kArtikel, 
    p1.cName, 
    p1.cKurzBeschreibung, 
    p1.dLetzteAktualisierung, 
    p1.dErstellt, 
    p1.cSeo,
    p2.kartikelpict,
    p2.nNr,
    p2.cPfad

FROM 
    tartikel AS p1 WHERE DATE(dErstellt) > (NOW() - INTERVAL 7 DAY)

INNER JOIN 
    tartikelpict AS p2 
    ON (p1.kArtikel = p2.kArtikel) WHERE (p2.nNr = 1)

ORDER BY 
    p1.kArtikel DESC

LIMIT
    100;', $connection);

今日と過去7日間の間に追加すると、コードは何も出力しません。

26
karadayi

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

[〜#〜] edit [〜#〜](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、ジュリアン日付、散発的に非正規の形式、またはエポックの開始からの秒数として、この答えはもっと長くする必要があります。

73
spencer7593

INNER JOINを使用しているので、次のようにWHERE句に条件を入れるだけです。

SELECT 
    p1.kArtikel, 
    p1.cName, 
    p1.cKurzBeschreibung, 
    p1.dLetzteAktualisierung, 
    p1.dErstellt, 
    p1.cSeo,
    p2.kartikelpict,
    p2.nNr,
    p2.cPfad  
FROM 
    tartikel AS p1 INNER JOIN tartikelpict AS p2 
    ON p1.kArtikel = p2.kArtikel
WHERE
  DATE(dErstellt) > (NOW() - INTERVAL 7 DAY)
  AND p2.nNr = 1
ORDER BY 
  p1.kArtikel DESC
LIMIT
    100;
5
fthiella