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