sql >> Databáze >  >> RDS >> Mysql

Jak vyloučíte víkendy z date_sub?

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

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.



  1. Oracle ekvivalentní MySQL INSERT IGNORE?

  2. znaková sada django s podivností MySQL

  3. Je lepší použít v MySQL nulové datum '0000-00-00 00:00:00' nebo NULL?

  4. Jak funguje načítání dat ze serveru SQL Server do SqlDataReader?