Tato otázka se týká odečítání pracovních dnů. Za předpokladu, že víkend je sobota-neděle, můžeme napsat řešení následovně:
Víme, že:
- Každý celý týden má 5 pracovních dnů.
- Takže
- počet_týdnů =
floor(@num_working_days / 5)
- delta_days =
@num_working_days % 5
- počet_týdnů =
Takže první aproximace by mohla být:
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)
To však nebude fungovat v následujících a podobných případech:
Obecně se nezdaří, pokud:
WEEKDAY(NOW()) - @num_working_days % 5 < 0
Aby se to započítalo, musí být při splnění této podmínky odečteny další 2 dny.
- overflow_days =
2 * (WEEKDAY(NOW()) - @num_working_days % 5 < 0)
Druhá aproximace by tedy byla:
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)
Konečně
Toto bude fungovat, dokud now()
není v week-end
den. V takovém případě budete muset nahradit now()
ve výše uvedeném vzorci s datem ukončení předchozího týdne:
- weekend_correction =
DATE_SUB(NOW(), INTERVAL WEEKDAY(NOW()) % 5 DAY)
Což vede k děsivě vypadající, ale plně funkční:
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);
Nyní, v produkčním provozu, vám doporučuji vytvořit na vašem serveru MySQL funkci, která tuto logiku zapouzdří, a tuto funkci můžete volat, kdykoli potřebujete odečíst pracovní dny.