ここに 2 セントを投入し、3 番目のオプションを使用して、毎日の 1 日を見つけ、7 の倍数を追加して最終結果を得ることに基づいて取得します。
関数
CREATE FUNCTION `ISNTHDAYINMONTH`(checkDate DATE, weekNumber INTEGER, dayOfWeek INTEGER, monthOfYear INTEGER) RETURNS INTEGER
NO SQL
DETERMINISTIC
BEGIN
DECLARE firstOfMonth DATE;
SET firstOfMonth = DATE_SUB(checkDate, INTERVAL DAYOFMONTH(checkDate) - 1 DAY); #Find the first day of the current month
IF DAYOFWEEK(checkDate) = dayOfWeek AND MONTH(checkDate) = monthOfYear #Make sure at least this matches
AND DAYOFMONTH(checkDate) = ((1 + (7 + dayOfWeek - DAYOFWEEK(firstOfMonth)) % 7) + 7 * (weekNumber - 1)) THEN #When the date matches the nth dayOfWeek day of the month
RETURN 1;
ELSE
RETURN 0; #Nope
END IF;
END
使用する
SELECT ISNTHDAYINMONTH(datecol, weekNumber, dayOfWeek, monthOfYear);
ここで、weekNumber は 1 ~ 5、dayOfWeek は 1 ~ 7 (1 = 日)、monthOfYear は 1 ~ 12 です。
例
datecol が 4 月の第 2 火曜日かどうかを確認するには:
SELECT ISNTHDAYINMONTH(datecol, 2, 3, 4);
計算
分解してみましょう。この行は、渡された日付の月の最初の日を取得します。
SET firstOfMonth = DATE_SUB(checkDate, INTERVAL DAYOFMONTH(checkDate) - 1 DAY); #Find the first day of the current month
このチェックにより、日付に正しい曜日と正しい月が含まれていることが保証されます (ユーザーが正しい曜日でさえない日付を渡した場合に備えて)。
DAYOFWEEK(checkDate) = dayOfWeek AND MONTH(checkDate) = monthOfYear
今、大きなもののために:
DAYOFMONTH(checkDate) = ((1 + (7 + dayOfWeek - DAYOFWEEK(firstOfMonth)) % 7) + 7 * (weekNumber - 1))
日付を取得するために 1 に追加する必要がある金額を取得するには、見ている dayOfWeek から、月の最初の日が該当する曜日を引いて、オフセット mod 7 を取得します ((dayOfWeek - DayOfWeek (最初)) % 7)。
月の初日は、対象の前日または当日になる可能性があるため、さらに 7 を追加してから 7 で mod することに注意してください。これは、MySQL の Mod 関数が mod を適切に計算しないために必要です。つまり、-1 % 7 は 6 のはずですが、MySQL は -1 を返します。7 を足してモジュラスを取ると、結果が常に正しいことが保証されます。
要約する:
NumberToAddToOneToGetDateOfFirstWeekDay = (7 + DayOfWeek - DayOfWeek(firstDayOfMonth)) %
次に、1 と、正しい週に到達するために必要な 7 の倍数ごとの数を追加します。