6 か月後にアカウントを非アクティブ化する SQL または PHP クエリが必要です。
簡単な解決策は
Select datediff(curdate(),last_date) as diff
土曜日と日曜日を除外しなければならない複雑な状況に陥りました。
レコードのステータス = 0 にしなければならない将来の日付または日に立ち往生しています
ここで見つけた答えは、2 つの日付または日付の範囲に基づいていますが、2 番目の日付を計算する必要があります。
これよりも効率的な方法があるはずですが、試してみる価値はあります (開始日として NOW() を使用):-
SELECT
CASE
WHEN DAYOFWEEK(NOW()) = 7
THEN
CASE
WHEN DAYOFWEEK(DATE_ADD(DATE(NOW()), INTERVAL (160 DIV 5) * 7 + (160 % 5) + 2 DAY)) = 7
THEN DATE_ADD(DATE(NOW()), INTERVAL (160 DIV 5) * 7 + (160 % 5) + 4 DAY)
WHEN DAYOFWEEK(DATE_ADD(DATE(NOW()), INTERVAL (160 DIV 5) * 7 + (160 % 5) + 2 DAY)) = 1
THEN DATE_ADD(DATE(NOW()), INTERVAL (160 DIV 5) * 7 + (160 % 5) + 3 DAY)
ELSE
DATE_ADD(DATE(NOW()), INTERVAL (160 DIV 5) * 7 + (160 % 5) + 2 DAY)
END
WHEN DAYOFWEEK(NOW()) = 1
THEN
CASE
WHEN DAYOFWEEK(DATE_ADD(DATE(NOW()), INTERVAL (160 DIV 5) * 7 + (160 % 5) + 1 DAY)) = 7
THEN DATE_ADD(DATE(NOW()), INTERVAL (160 DIV 5) * 7 + (160 % 5) + 3 DAY)
WHEN DAYOFWEEK(DATE_ADD(DATE(NOW()), INTERVAL (160 DIV 5) * 7 + (160 % 5) + 1 DAY)) = 1
THEN DATE_ADD(DATE(NOW()), INTERVAL (160 DIV 5) * 7 + (160 % 5) + 2 DAY)
ELSE
DATE_ADD(DATE(NOW()), INTERVAL (160 DIV 5) * 7 + (160 % 5) + 1 DAY)
END
ELSE
CASE
WHEN DAYOFWEEK(DATE_ADD(DATE(NOW()), INTERVAL (160 DIV 5) * 7 + (160 % 5) DAY)) = 7
THEN DATE_ADD(DATE(NOW()), INTERVAL (160 DIV 5) * 7 + (160 % 5) + 2 DAY)
WHEN DAYOFWEEK(DATE_ADD(DATE(NOW()), INTERVAL (160 DIV 5) * 7 + (160 % 5) DAY)) = 1
THEN DATE_ADD(DATE(NOW()), INTERVAL (160 DIV 5) * 7 + (160 % 5) + 1 DAY)
ELSE
DATE_ADD(DATE(NOW()), INTERVAL (160 DIV 5) * 7 + (160 % 5) DAY)
END
END
日数を 5 で割ると週数が得られ、mods を 5 で割ると余分な日数が得られます。開始日が土曜日の場合は 2 日追加され、日曜日の場合は 1 日追加され、週数の 7 倍と余分な日数が追加されます。結果の日が土曜日の場合はさらに 2 日追加され、日曜日の場合はさらに 1 日追加されます。
または、やや奇妙な方法で:-
SELECT MAX(EndDate)
FROM
(
SELECT @StartDate:=DATE_ADD(@StartDate, INTERVAL CASE WHEN DAYOFWEEK(@StartDate) = 6 THEN 3 WHEN DAYOFWEEK(@StartDate) = 7 THEN 3 WHEN DAYOFWEEK(@StartDate) = 1 THEN 2 ELSE 1 END DAY) AS EndDate
FROM
(
SELECT units.i + tens.i * 10 + hundreds.i * 100 AS daysAdd
FROM (SELECT 0 AS i UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) units,
(SELECT 0 AS i UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) tens,
(SELECT 0 AS i UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) hundreds
HAVING daysAdd < 160
) Sub1
CROSS JOIN
(
SELECT @aCnt:=0, @StartDate:=DATE(NOW())
) sub2
) Sub0