MySQL 過去7日間を選択 質問する

MySQL 過去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 日間を追加しても、コードは何も出力しません。

ベストアンサー1

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ユリウス日) の文字列として保存したり、散発的に非標準形式として保存したり、エポックの開始からの秒数として保存したりしないことを前提としています。そうしないと、この回答はさらに長くなります。

おすすめ記事