Saya memiliki masalah serupa:Saya perlu menghitung angka minggu berdasarkan aturan berikut:
- Minggu dimulai pada hari Jumat
- Hari-hari sisa dalam satu tahun (semua hari setelah Jumat terakhir tahun itu yang tidak menyelesaikan satu minggu) harus dihitung dalam minggu pertama tahun berikutnya.
Misalnya:
- 27/12/2012 (Kamis) seharusnya Pekan 52 tahun 2012
- 28/12/2012 (Jumat) seharusnya Minggu 1 tahun 2013
- Minggu 1 2013 dimulai dari 28/12/2012 hingga 1/3/2013
Saya membuat pernyataan ini yang menghitung TAHUN dan ANGKA MINGGU berdasarkan aturan ini yang dapat Anda sesuaikan dengan mudah dengan keadaan Anda:
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));
Bagian yang sulit hanyalah ungkapan ini:
ceil(( dayofyear(current_date) + dayofweek(date_format(current_date, '%Y-01-01'))+1 )/7)
Selebihnya (klausa If) hanya untuk mengadaptasi hasil ekspresi untuk membuat year+1 dan week =1 pada minggu 53.
Saya akan mencoba menjelaskan ungkapan itu sebaik mungkin. Ekspresi berikut memberi Anda angka minggu yang sangat sederhana (hari dalam setahun dibagi 7 hari dalam seminggu dibulatkan ke atas):
ceil(( dayofyear(current_date))/7)
Tetapi sekarang Anda ingin memulainya pada hari Jumat (atau hari lainnya). Untuk melakukan ini, Anda perlu menambahkan hari ini, hari-hari dalam minggu pertama yang merupakan bagian dari tahun sebelumnya (sepertinya saat ini Anda sebenarnya dimulai beberapa hari sebelumnya, karena minggu pertama Anda berisi hari-hari dari tahun sebelumnya). Ini ekspresi menghitung offset itu berdasarkan hari kerja pada Jan/1:
dayofweek(date_format(current_date, '%Y-01-01'))+OFFSET
Offset adalah perbedaan antara 7 dan hari kerjanomor yang Anda inginkan untuk memulai minggu:
- 0 untuk hari Sabtu
- 1 untuk hari Jumat
- 2 untuk hari Kamis
- 3 untuk hari Rabu...
Jadi sekarang Anda hanya perlu menambahkannya ke yang sebelumnya menghasilkan ekspresi yang disebutkan di atas yang menghitung angka minggu yang dimulai pada hari kerja apa pun dan dengan asumsi minggu 1 dimulai pada tahun sebelumnya:
ceil(( dayofyear(current_date) + dayofweek(date_format(current_date, '%Y-01-01'))+OFFSET )/7)
Lalu saya baru saja menambahkan IF yang mengubah minggu 53 menjadi minggu 1 dan satu lagi menambahkan 1 ke tahun jika itu minggu 53.