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

Làm cách nào để loại trừ các ngày cuối tuần khỏi date_sub?

Câu hỏi này là về việc trừ ngày làm việc. Giả sử cuối tuần đó là Thứ Bảy-Chủ Nhật, chúng ta có thể viết lời giải như sau:

Chúng tôi biết rằng:

  • Mỗi tuần có 5 ngày làm việc.
  • Vì vậy,
    • num_of_weeks =floor(@num_working_days / 5)
    • delta_days =@num_working_days % 5

Vì vậy, ước tính đầu tiên có thể là:

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)

Tuy nhiên, điều này sẽ không hoạt động trong các trường hợp sau và các trường hợp tương tự:

Nói chung, nó sẽ không thành công nếu:

WEEKDAY(NOW()) - @num_working_days % 5 < 0

Để giải thích điều đó, phải trừ thêm 2 ngày bất cứ khi nào điều kiện này được đáp ứng.

  • flow_days =2 * (WEEKDAY(NOW()) - @num_working_days % 5 < 0)

Vì vậy, ước tính thứ hai sẽ là:

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)

Cuối cùng,

Điều này sẽ hoạt động miễn là now() không có trong week-end ngày. Đối với trường hợp đó, bạn cần thay thế now() trong công thức trên với ngày kết thúc tuần trước:

  • cuối tuần_correction =DATE_SUB(NOW(), INTERVAL WEEKDAY(NOW()) % 5 DAY)

Điều này dẫn đến cái nhìn khủng khiếp nhưng hoạt động đầy đủ:

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); 

Bây giờ, trong quá trình sản xuất, tôi khuyên bạn nên tạo một hàm trên máy chủ MySQL của mình để đóng gói logic này và bạn có thể gọi hàm này bất cứ khi nào bạn cần trừ ngày làm việc.



  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 Không thể giảm chỉ mục cần thiết trong một ràng buộc khóa ngoại

  2. Ràng buộc khóa ngoại không thành công

  3. Trình kết nối Python MySQL - tìm thấy kết quả chưa đọc khi sử dụng fetchone

  4. Truy vấn Mysql để chuyển đổi động các hàng thành cột trên cơ sở hai cột

  5. Cách cài đặt MySQL với phpMyAdmin trên Ubuntu 14.04