Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Funkcja MySQL do znalezienia liczby dni roboczych między dwiema datami

To wyrażenie -

5 * (DATEDIFF(@E, @S) DIV 7) + MID('0123444401233334012222340111123400012345001234550', 7 * WEEKDAY(@S) + WEEKDAY(@E) + 1, 1)

oblicza liczbę dni roboczych między datą rozpoczęcia @S a datą zakończenia @E.

Zakłada, że ​​data zakończenia (@E) nie jest wcześniejsza niż data rozpoczęcia (@S).Zgodny z DATEDIFF, ponieważ ta sama data rozpoczęcia i data zakończenia daje zero dni roboczych.Ignoruje święta.

Ciąg cyfr jest skonstruowany w następujący sposób. Utwórz tabelę dni rozpoczęcia i dni zakończenia, wiersze muszą zaczynać się od poniedziałku (WEEKDAY0), a kolumny również od poniedziałku. Wypełnij przekątną od lewego górnego do dolnego prawego rogu wszystkimi 0 (tzn. między poniedziałkiem a poniedziałkiem, wtorkiem a wtorkiem itd. jest 0 dni roboczych). prawda, jeden dzień na raz. Jeśli wylądujesz w kolumnie z dniami weekendu (poza dniem roboczym), liczba dni roboczych nie ulega zmianie, jest przenoszona od lewej. W przeciwnym razie liczba dni roboczych wzrasta o jeden. Kiedy dojdziesz do końca pętli, wróć do początku tego samego rzędu i kontynuuj, aż ponownie dotrzesz do przekątnej. Następnie przejdź do następnego rzędu.

Np. Zakładając, że sobota i niedziela nie są dniami roboczymi -

 | M T W T F S S
-|--------------
M| 0 1 2 3 4 4 4
T| 4 0 1 2 3 3 3
W| 3 4 0 1 2 2 2
T| 2 3 4 0 1 1 1
F| 1 2 3 4 0 0 0
S| 1 2 3 4 5 0 0
S| 1 2 3 4 5 5 0

Następnie połącz 49 wartości z tabeli w łańcuch.

Daj mi znać, jeśli znajdziesz jakieś błędy.

- Ulepszona tabela:

 | M T W T F S S
-|--------------
M| 0 1 2 3 4 4 4
T| 4 0 1 2 3 3 3
W| 3 4 0 1 2 2 2
T| 2 3 4 0 1 1 1
F| 1 2 3 4 0 0 0
S| 0 1 2 3 4 0 0
S| 0 1 2 3 4 4 0

poprawiony ciąg:'0123444401233334012222340111123400001234000123440'

ulepszona ekspresja:

5 * (DATEDIFF(@E, @S) DIV 7) + MID('0123444401233334012222340111123400001234000123440', 7 * WEEKDAY(@S) + WEEKDAY(@E) + 1, 1)


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Używanie SqlDataAdapter do wstawiania wiersza

  2. Jak sprawnie znaleźć najbliższe lokalizacje w pobliżu danej lokalizacji?

  3. Klucze obce MySQL

  4. LOAD DATA LOCAL INFILE zabronione w... PHP

  5. Zapowiedź ClusterControl 1.7.2:ulepszona kopia zapasowa PostgreSQL i wsparcie dla TimescaleDB i MySQL 8.0