1

ユーザーのリストを毎月メールで送信するcronジョブがあります。cronは毎日実行され、usersテーブルでsignup_dateを検索します。アイデアは、ユーザーがサインアップしてから1か月後にメールを送信し、アカウントの存続期間中これを継続することです。私はこのようなことをすることを考えていました:

SELECT *
FROM users 
WHERE DAYOFMONTH(signup_date) = DAYOFMONTH(now());

問題は、31日にサインアップするユーザーを隔月で見逃すことです(うるう年の2月の問題は言うまでもありません)。すべてのユーザーが毎日実行されるときに少なくとも月に1回選択されることを保証するSQLステートメントはありますか?DBに余分なフィールド(date_last_emailedなど)を作成したくありません。

4

2 に答える 2

3

たぶん、その月の最終日に、その日以降にサインアップしたすべてのユーザーが含まれますか?

WHERE IF(
  DAY(NOW()) == DAY(LAST_DAY(NOW())),
  DAY(signup_date) >= DAY(NOW()),
  DAY(signup_date) = DAY(NOW())
)
于 2012-10-09T19:40:43.970 に答える
0
SELECT a, b
  FROM tbl
 WHERE DAYOFMONTH(signup_date) = DAYOFMONTH(CURRENT_DATE)
       OR
       -- special handling for end of month
       (LAST_DAY(CURRENT_DATE) = CURRENT_DATE
        AND
        DAYOFMONT(signup_date) > DAYOFMONTH(CURRENT_DATE))

うるう年でない年の2月28日に、これは任意の月の29日、30日、または31日にサインアップした人に電子メールを送信します。

UPDATE コメントごとに修正。

于 2012-10-09T19:46:37.300 に答える