1. ホーム
  2. mysql

[解決済み] MySQL 過去7日間を選択

2022-02-18 09:24:23

質問

ここの投稿を読んで、特別なことはないように思えたのですが、最後の日のエントリーを選択することができません。

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日間の間を追加したら、私のコードは何も出力されません。

どうすればいいですか?

その 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か)、どんなデータがあるのか...何を返すべきかは、仕様書の解釈次第ですね。

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

カラムが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日間)のように、quot;start" と "end" に対応する値を返す式を用意したら、WHERE句の範囲比較でそれらの式を使用することができる。

(開発者によっては DATE_ADDDATE_SUB 関数の代わりに + INTERVAL val DAY/HOUR/MINUTE/MONTH/YEAR の構文があります。

そして、MySQLはDATE、DATETIME、TIMESTAMPデータ型を扱うための便利な関数をいくつか提供しています...。日付、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データ型にquot;date"を格納し、例えば様々な形式の文字列として格納しないことを想定しています。 'dd/mm/yyyy' , m/d/yyyy とか、ユリウス暦の日付とか、散発的な非正規のフォーマットとか、エポックの始まりからの秒数とかで、この答えはもっと長くなる必要があるんだ。