Tôi gặp sự cố tương tự:Tôi cần tính toán số tuần dựa trên các quy tắc sau:
- Tuần bắt đầu vào Thứ Sáu
- Những ngày còn lại của năm (tất cả những ngày sau ngày thứ Sáu cuối cùng của năm không hoàn thành một tuần) sẽ được tính vào tuần đầu tiên của năm tiếp theo.
Ví dụ:
- Ngày 27/12/2012 (Thứ Năm) sẽ là Tuần 52 của năm 2012
- Ngày 28/12/2012 (Thứ Sáu) sẽ là Tuần 1 của năm 2013
- Tuần 1 năm 2013 kéo dài từ 28/12/2012 đến 3/1/2013
Tôi đã đưa ra tuyên bố này để tính toán cả NĂM và TUẦN dựa trên các quy tắc này mà bạn có thể dễ dàng điều chỉnh cho phù hợp với tình hình của mình:
SELECT IF(ceil(( dayofyear(current_date) + dayofweek(date_format(current_date, '%Y-01-01'))+1 )/7) > 52, YEAR(current_date)+1, YEAR(current_date)),
IF(ceil(( dayofyear(current_date) + dayofweek(date_format(current_date, '%Y-01-01'))+1 )/7) > 52, 1, ceil(( dayofyear(current_date) + dayofweek(date_format(current_date, '%Y-01-01'))+1 )/7));
Phần khó chỉ là biểu thức sau:
ceil(( dayofyear(current_date) + dayofweek(date_format(current_date, '%Y-01-01'))+1 )/7)
Phần còn lại (mệnh đề If) chỉ để điều chỉnh kết quả của biểu thức thành năm + 1 và tuần =1 vào tuần 53.
Tôi sẽ cố gắng giải thích biểu thức tốt nhất có thể. Biểu thức sau cung cấp cho bạn số tuần thuần túy đơn giản (ngày trong năm chia cho 7 ngày trong một tuần được làm tròn):
ceil(( dayofyear(current_date))/7)
Nhưng bây giờ bạn muốn bắt đầu vào thứ Sáu (hoặc bất kỳ ngày nào khác). Để thực hiện việc này, bạn cần thêm ngày hiện tại, những ngày của tuần đầu tiên là một phần của năm trước (nó giống như hiện tại của bạn thực sự bắt đầu một vài ngày trước đó, vì tuần đầu tiên của bạn chứa các ngày từ năm trước). biểu thức tính toán bù đắp dựa trên ngày trong tuần vào ngày 1 tháng 1:
dayofweek(date_format(current_date, '%Y-01-01'))+OFFSET
Phần bù là sự khác biệt giữa số 7 và số ngày trong tuần mà bạn muốn tuần bắt đầu:
- 0 cho Thứ Bảy
- 1 cho Thứ Sáu
- 2 cho Thứ Năm
- 3 cho Thứ Tư ...
Vì vậy, bây giờ bạn chỉ cần thêm nó vào cái trước đó dẫn đến biểu thức đã đề cập ở trên tính các số tuần bắt đầu vào bất kỳ ngày nào trong tuần và giả sử tuần 1 bắt đầu vào năm trước:
ceil(( dayofyear(current_date) + dayofweek(date_format(current_date, '%Y-01-01'))+OFFSET )/7)
Sau đó, tôi chỉ thêm IF để biến tuần 53 thành tuần 1 và một IF khác để thêm 1 vào năm nếu đó là tuần 53.