web-dev-qa-db-ja.com

期限切れの日時から3日後のレコードを選択する

datetime timestampを含むテーブルがあります。私が探しているのは、datetime timestampに基づいて、30日の有効期限からちょうど3日後のレコードを選択することです。

これは正しいとは思えませんが、ここまでのところです。

    SELECT jobs.*,occupations.title
    FROM jobs
    LEFT JOIN occupations on occupations.id = jobs.occupation_id
    WHERE DATE_ADD(jobs.`date_created`,INTERVAL 27 DAY) = DATE(NOW())

助けてください :)

2
jkushner

date_createdDATEの場合は、次のようにします。

SELECT jobs.*,occupations.title
FROM jobs
LEFT JOIN occupations on occupations.id = jobs.occupation_id
WHERE jobs.`date_created` = DATE(NOW() - INTERVAL 27 DAY);

date_createdDATETIMEまたはTIMESTAMPで、時間部分が「00:00:00」の場合、次のようにします。

SELECT jobs.*,occupations.title
FROM jobs
LEFT JOIN occupations on occupations.id = jobs.occupation_id
WHERE jobs.`date_created` >= DATE(NOW() - INTERVAL 27 DAY) + INTERVAL 0 SECOND;

これらのクエリは、クエリのWHERE句がインデックスレンジスキャンを誘発するのに対し、質問のWHERE句はテーブル全体を誘発するため、問題のクエリよりもパフォーマンスの点で優れています。スキャン(date_createdがインデックス付けされている場合でも)。

jobsテーブルにdate_createdのインデックスがない場合は、インデックスを作成します

ALTER TABLE jobs ADD INDEX (date_created);

試してみる !!

5
RolandoMySQLDBA