2

私がやりたいことの疑似コード:

SELECT * FROM table WHERE NTH_DAY(DATE(table_date)) = NTH_DAY($input_date);

特定の日付の月の n 番目の平日を特定したいと考えています。たとえば、「2013-08-30」と入力すると、5 が返されます。これは、その月の平日 (金曜日) が 5 回目であるためです。

私は数え切れないほどの同様の質問を読んできましたが、大多数は正反対の質問を探しています。他の質問は私が求めているもののようですが、それらは私が理解できないさまざまなプログラミング言語で書かれています。

MySQLクエリでこれが可能かどうか、またその方法を誰かが説明してもらえますか?

4

4 に答える 4

4

特定の日がどの「nth」であるかを見つけるのはかなり簡単です。

select (case when day(table_date) between 1 and 7 then 1
             when day(table_date) between 8 and 14 then 2
             when day(table_date) between 15 and 21 then 3
             when day(table_date) between 22 and 28 then 4
             else 5
        end) as NthDay

「剰余」演算を使用してこれを行うこともできます。

select 1 + floor((day(table_date) - 1) / 7) ) as NthDay
于 2013-08-21T18:55:56.200 に答える
1

ここに 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 の倍数ごとの数を追加します。

于 2015-07-03T21:30:31.090 に答える
0

これにより、週の数が得られます (実際には、第 5 金曜日または第 5 月曜日の場合と同じです)。

SELECT WEEK(dateasd,5) - 
WEEK(DATE_SUB(dateasd, INTERVAL DAYOFMONTH(dateasd)-1 DAY),5)
from test

Weekday() 関数を使用して、現在の曜日を見つけます

http://www.sqlfiddle.com/#!2/7a8b6/2/0のフィドル

于 2013-08-21T18:55:09.100 に答える