Pertanyaan ini tentang pengurangan hari kerja. Dengan asumsi akhir pekan itu adalah Sabtu-Minggu, kita dapat menulis solusinya sebagai berikut:
Kami tahu bahwa:
- Setiap minggu penuh memiliki 5 hari kerja.
- Jadi,
- num_of_weeks =
floor(@num_working_days / 5)
- delta_days =
@num_working_days % 5
- num_of_weeks =
Jadi, perkiraan pertama bisa menjadi:
SET @num_working_days = 4; -- pick any integer
SET @num_days = 7 * FLOOR(@num_working_days / 5) - @num_working_days % 5;
SELECT DATE_SUB(NOW(), INTERVAL @num_days DAY)
Namun, ini tidak akan berfungsi dalam kasus berikut dan kasus serupa:
Biasanya akan gagal jika:
WEEKDAY(NOW()) - @num_working_days % 5 < 0
Untuk itu, tambahan 2 hari harus dikurangi setiap kali kondisi ini terpenuhi.
- overflow_days =
2 * (WEEKDAY(NOW()) - @num_working_days % 5 < 0)
Jadi, perkiraan kedua adalah:
SET @num_working_days = 4;
SET @overflow_days = 2 * (WEEKDAY(NOW()) - @num_working_days % 5 < 0)
SET @num_days = 7 * FLOOR(@num_working_days / 5) - @num_working_days % 5;
SELECT DATE_SUB(NOW(), INTERVAL @num_days DAY)
Akhirnya,
Ini akan berfungsi selama now()
tidak dalam week-end
hari. Untuk itu, Anda harus mengganti now()
dalam rumus di atas dengan tanggal akhir minggu sebelumnya:
- koreksi_akhir pekan =
DATE_SUB(NOW(), INTERVAL WEEKDAY(NOW()) % 5 DAY)
Yang mengarah ke tampilan yang mengerikan tetapi berfungsi penuh:
SET @num_working_days = 4;
SET @weekend_correction = DATE_SUB(NOW(), INTERVAL WEEKDAY(NOW()) % 5 DAY);
SET @overflow_days = 2 * (WEEKDAY(@weekend_correction) - @num_working_days % 5 < 0);
SET @num_days = 7 * FLOOR(@num_working_days / 5) - @num_working_days % 5;
SELECT DATE_SUB(@weekend_correction, INTERVAL @num_days DAY);
Sekarang, dalam produksi, saya sarankan Anda membuat fungsi di server MySQL Anda untuk merangkum logika ini, dan Anda dapat memanggil fungsi ini kapan pun Anda perlu mengurangi hari kerja.