ここでいくつかの投稿を読みましたが、特に特別なことはないように思われますが、過去数日間のエントリをまだ選択できません。
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
ユリウス日) の文字列として保存したり、散発的に非標準形式として保存したり、エポックの開始からの秒数として保存したりしないことを前提としています。そうしないと、この回答はさらに長くなります。