Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Tuần trong năm cho các tuần bắt đầu từ thứ Bảy

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.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MySQL tham gia với mệnh đề where

  2. Cách tìm các bản sao trong 2 cột không phải 1

  3. mysql tham gia BẬT và VÀ để làm sáng tỏ tài hùng biện

  4. THÔNG TIN DỮ LIỆU TẢI MySQL với dấu phẩy làm dấu phân tách thập phân

  5. Vòng lặp qua các tập kết quả trong MySQL