0

こんにちは、毎日午前 12 時に実行される cron ジョブの mysql クエリの日付ロジックと完全に混同しています。

車のリストの有効期限がmysqlの日時形式になっている自動リストWebサイトに取り組んでいます。

期限切れのすべてのリストは、有効期限の日時から 7 日後にウェブサイトから削除されます。

cronジョブが実行されると、次のことが行われます

タスク 1 - リストの有効期限が切れたことを知らせる電子メール アラートをユーザーに送信します。

そのため、最後に cron ジョブが実行されてから期限切れになったすべてのリストを選択し、それより前のリストは含めないようにして、リストごとに 1 回だけ期限切れアラート メールを送信する必要があります。

このタスクの次のSQLクエリを試しました(これも混同されています)

SELECT car_id FROM cars WHERE expiry_date > DATE_SUB(NOW(), INTERVAL 1 DAY) AND expiry_date < NOW()

タスク 2 - リストが 24 時間後に完全に削除されることを知らせる電子メール アラートをユーザーに送信します。

そのため、有効期限が切れてから 24 時間以上または 6 日以上経過した後に削除される予定のすべてのリストを選択する必要があり、最低 24 時間以内に更新できるようにする必要があります。また、1回限りの電子メールアラートではなく複数の電子メールアラートを回避するために、1日で期限切れになるリストのみが選択され、他のリストは選択されないように、SQLクエリを選択/構築する必要があります

このタスクの次のSQLクエリを試しました(このクエリと完全に混同しています)

SELECT car_id FROM cars WHERE expiry_date > DATE_SUB(NOW(), INTERVAL 7 DAY) AND expiry_date < DATE_SUB(NOW(), INTERVAL 1 DAY)

タスク 3 - 7 日以上前に有効期限が切れたすべてのリストを削除する

このタスクの次のSQLクエリを試しました

SELECT car_id FROM cars WHERE expiry_date < DATE_SUB(NOW(), INTERVAL 7 DAY)

cron が希望どおりに機能するように、3 つのクエリすべてを完成させるのを手伝ってください。また、それが >= (以上) または <= (以下) でなければならない場所を教えてください。

ここに sqlfiddle テーブル構造といくつかのレコードがあります (ただし、それらはまだ有効期限が切れていません)

http://sqlfiddle.com/#!2/cfcdf

本当に助かります。

4

3 に答える 3

1

これらのクエリをチェックしてください

select * from cars where datediff(EXPIRY_DATE,now())=-1;


select * from cars where 
datediff(DATE_ADD(EXPIRY_DATE, interval 24 hour),now())>=1 and
datediff(DATE_ADD(EXPIRY_DATE, interval 24 hour),now()) <=2;



select * from cars where datediff(expiry_date,now())<=-7;

彼らはあなたの必要に応じて働いています。

フィドル http://sqlfiddle.com/#!2/785ea/5

于 2013-02-04T06:16:23.463 に答える
1

これはあなたが探しているものですか?expiry_date別の列を追加して、との違いを確認し、current date time扱っている日付をよりよく理解してください。MYSQL のいくつかの日付関数を調べてください。

SQLFIDDLE デモ

-- 3rd query expiry dates older than 7 days from 
-- today

SELECT car_id, expiry_Date, 
DATE_sub(NOW(), INTERVAL 7 DAY)
FROM cars 
WHERE expiry_date <= 
DATE_sub(NOW(), INTERVAL 7 DAY)
;

-- same

SELECT car_id, expiry_Date, 
DATE_ADD(NOW(), INTERVAL -7 DAY)
FROM cars 
WHERE expiry_date <= 
DATE_ADD(NOW(), INTERVAL -7 DAY)
;


-- 2nd query going to expire in exactly 1 day

SELECT car_id, expiry_date, 
Now() + interval 1 day
FROM cars 
WHERE expiry_Date = Now() + interval 1 day
;

-- 1st query: expired 

SELECT car_id FROM cars 
WHERE expiry_date < Now()
;

-- 1st query: expired last 24 hours

SELECT car_id,DATEDIFF(expiry_date, Now())
FROM cars 
WHERE expiry_Date < Now()
AND expiry_Date >= Now() - interval 1 day
;
于 2013-02-04T06:17:57.523 に答える
0

クエリに大きな問題はありません。使用した関数を理解していない場合は、グーグルで検索して、理解するまで読んでください。

あなたのアプローチには根本的な問題があります。それは、正確に24時間間隔(ミリ秒まで)で実行されているcronジョブに依存している、または2倍のアップや省略があるということです。

バッチプログラムが最後に実行された日時の詳細を格納するために、別のテーブルが必要です。これを1行で開始し、過去の日付を長くして、開始点を設定します。

によって最新のバッチを取得できますSELECT MAX(date_ran) FROM BatchRecordTables。これをローカル変数T0に格納します。現在の時刻を取得し、これをローカル変数T1に格納します(複数のクエリでNOW()を使用しないでください。時刻がわずかに異なり、同じである必要があります)。これの構文がMySQLかどうかはわかりません。検索する必要があります。

その後、あなたの状況はになります。

  1. cronジョブが最後に実行されてからリストの有効期限が切れている人に電子メールを送信しますSELECT car_id FROM cars WHERE Expiry_Date BETWEEN T0 AND T1。これにより、このバッチと前のバッチの間にリストの有効期限が切れた人のみが選択されます。
  2. 2番目のケースでは、これらの人々が最初の電子メールを受け取ったこと、つまり、最後のバッチ実行の前にSELECT car_id FROM cars WHERE Expiry_Date BETWEEN DATE_SUB(T1, INTERVAL 6 DAY) AND T0リストの有効期限が切れたことを知る必要があります。これにより、リストが最後のバッチより前に期限切れになった(つまり、期限切れの電子メールを受け取った)6日以上前のユーザーのみが選択されます。
  3. 同じlogiが適用されます-彼らが2番目の電子メールを受け取ったことを知りたいです。SELECT car_id FROM cars WHERE Expiry_Date BETWEEN DATE_SUB(T1, INTERVAL 7 DAY) AND DATE_SUB(T0, INTERVAL 6 DAY)

また、リストを完全に削除するのではなく、DeletedListingsテーブルにコピーするか、Deleted列でフラグを立てることをお勧めします。それぞれに長所と短所があります。情報化時代では、データを捨てないでください。いつ価値があるかはわかりません。

于 2013-02-04T06:16:23.137 に答える