Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Bagaimana Anda mengecualikan akhir pekan dari date_sub?

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

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.



  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 menunjukkan baris yang salah saat menggunakan GROUP BY

  2. Bagaimana saya bisa memeriksa jenis mesin MySQL untuk tabel tertentu?

  3. Isi JFreechart TimeSeriesCollection dari Mysql DB?

  4. Bagaimana cara Memasukkan Beberapa catatan dalam satu perjalanan basis data menggunakan PDO?

  5. Mengapa Data Aplikasi Survei Django SessionWizardView saya tidak muncul dalam format yang dapat digunakan di Database MySQL saya?