यह प्रश्न कार्य दिवसों को घटाने के बारे में है। यह मानते हुए कि सप्ताहांत शनिवार-रविवार है, हम समाधान इस प्रकार लिख सकते हैं:
हम जानते हैं कि:
- हर पूरे सप्ताह में 5 कार्य दिवस होते हैं।
- इस प्रकार,
- num_of_weeks =
floor(@num_working_days / 5)
- delta_days =
@num_working_days % 5
- num_of_weeks =
तो, पहला सन्निकटन हो सकता है:
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)
हालांकि, यह निम्नलिखित और इसी तरह के मामलों में काम नहीं करेगा:
आम तौर पर, यह विफल हो जाएगा यदि:
WEEKDAY(NOW()) - @num_working_days % 5 < 0
इसका हिसाब लगाने के लिए, जब भी यह शर्त पूरी होती है तो अतिरिक्त 2 दिन घटाए जाने चाहिए।
- overflow_days =
2 * (WEEKDAY(NOW()) - @num_working_days % 5 < 0)
तो, दूसरा सन्निकटन होगा:
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)
आखिरकार,
यह तब तक काम करेगा जब तक now()
week-end
में नहीं है दिन। उस स्थिति के लिए, आपको now()
. को बदलना होगा पिछले सप्ताह की समाप्ति तिथि के साथ उपरोक्त सूत्र में:
- सप्ताहांत_सुधार =
DATE_SUB(NOW(), INTERVAL WEEKDAY(NOW()) % 5 DAY)
जो भयानक दिखने वाले लेकिन पूरी तरह से काम करने की ओर ले जाता है:
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);
अब, उत्पादन में, मैं अनुशंसा करता हूं कि आप इस तर्क को समाहित करने के लिए अपने MySQL सर्वर पर एक फ़ंक्शन बनाएं, और जब भी आपको कार्य दिवसों को घटाने की आवश्यकता हो, तो आप इस फ़ंक्शन को कॉल कर सकते हैं।