[解決済み] 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日間の間を追加したら、私のコードは何も出力されません。
どうすればいいですか?
その
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_ADD
と
DATE_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
とか、ユリウス暦の日付とか、散発的な非正規のフォーマットとか、エポックの始まりからの秒数とかで、この答えはもっと長くなる必要があるんだ。
関連
-
[解決済み】MySQLを使用してランダムでユニークな8文字の文字列を生成する方法
-
[解決済み] SQL ServerでSELECTからUPDATEする方法とは?
-
[解決済み] MySQLでdatetimeとtimestampのどちらのデータ型を使用すべきですか?
-
[解決済み] MySQLでコマンドラインを使用してSQLファイルをインポートするにはどうすればよいですか?
-
[解決済み] 各GROUP BYグループの最初の行を選択しますか?
-
[解決済み] SQLのSELECTでIF...THENを実行するにはどうすればよいですか?
-
[解決済み] ...値に挿入する ( SELECT ... FROM ... )
-
[解決済み] MySQLのAUTO_INCREMENTをリセットする方法
-
[解決済み] MySQLの複数行を1つのフィールドに連結することはできますか?
-
[解決済み] 各グループの最後のレコードを取得する - MySQL
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】MySQLのDESCRIBE [table]に相当するSQLiteはあるか?]
-
[解決済み】MySQLのforeachループ
-
[解決済み] MySQLの グループ関数の無効な使用
-
[解決済み] MySQLのforeachループ
-
[解決済み] mysqldです。dir を data に変更できません。サーバーが起動しません
-
[解決済み] MySQLを使用したパーセンタイル値の計算
-
[解決済み] mysql 拡張は非推奨で、将来的に削除されます: 代わりに mysqli か PDO を使ってください [重複] 。
-
[解決済み] ローカルマシンからリモートDBをmysqldumpする方法
-
[解決済み] 「他のデータベースへのクエリを無視する」コマンドライン
-
[解決済み] mysqlのテーブルからユニークキーを削除する方法