(Chỉ cần làm rõ cho độc giả trong tương lai: câu trả lời này cho câu hỏi cũ này đã được bổ sung vì một bounty mà ngụ ý câu trả lời hiện nay là không đáp ứng, vì vậy tôi thêm này giải pháp/định nghĩa với thêm "tùy chọn cấu hình" cho tất cả các loại tình huống.)
Không có định nghĩa chuẩn cho Week of month
, nhưng một giải pháp chung sẽ là công thức sau đây, bạn có thể tinh chỉnh yêu cầu của bạn:
select (dayofmonth(dateField) + 6 + (7 - "min_days_for_partial_week")
- (weekday(datefield) - "weekday_startofweek" + 7) MOD 7) DIV 7 as week_of_month;
nơi
"weekday_startofweek"
phải là được thay thế bằng ngày trong tuần mà bạn muốn là ngày đầu tiên trong tuần (0 = Monday
, 6 = Sunday
).
"min_days_for_partial_week"
là số ngày mà tuần đầu tiên phải tính là tuần 1 (giá trị 1
đến 7
). Giá trị chung sẽ là 1
(ngày đầu tiên của tháng luôn là tuần 1), 4
(điều này sẽ tương tự như "tuần iso trong năm", trong đó tuần đầu tiên của năm là tuần chứa thứ năm, vì vậy có ít nhất 4 ngày) và 7
(tuần 1 là tuần hoàn chỉnh đầu tiên).
Công thức này sẽ trả về giá trị 0
đến 6
. 0
có nghĩa là tuần hiện tại là một tuần không có đủ ngày để tính là tuần 1 và 6
chỉ có thể xảy ra khi bạn cho phép một phần tuần có ít hơn 3 ngày là tuần 1.
Ví dụ:
Nếu ngày đầu tiên trong tuần là thứ Hai ("weekday_startofweek" = 0
) và tuần 1 nên luôn có một tuần toàn bộ ("min_days_for_partial_week" = 7
), điều này sẽ đơn giản hóa để
select (dayofmonth(dateField) + 6 - weekday(datefield)) DIV 7 as week_of_month;
Ví dụ, đối với 2016-06-02
bạn sẽ nhận được 0
, vì tháng sáu 2016 bắt đầu với một thứ tư y và cho 2016-06-06
bạn sẽ nhận được 1
, vì đây là ngày Thứ Hai đầu tiên trong tháng Sáu năm 2016.
Để bắt chước công thức của bạn, nơi mà ngày đầu tiên của tuần luôn là tuần 1 ("min_days_for_partial_week" = 1
), và tuần bắt đầu với Chủ nhật ("weekday_startofweek" = 6
), đây sẽ là
select (dayofmonth(dateField) + 12 - (weekday(datefield) + 1) MOD 7) DIV 7 as week_of_month;
Mặc dù bạn có thể muốn nhận xét đúng để biết trong 2 năm mà hằng số của bạn đến từ đó.
Tôi đoán nó có thể không phải là giải pháp chung nhất, nhưng đối với những gì tôi cần một tuần bắt đầu vào thứ Hai. Vì vậy, nói rằng ngày 1 của tháng rơi vào ngày chủ nhật, chủ nhật đó sẽ được tính là tuần 1. Nếu điều đó có ý nghĩa ... – YiSh