Kolejna notka z dziedziny baz danych.
Dzisiaj chciałbym pokazać w jaki sposób wyliczyć ilość dni (oraz ilość dni roboczych w drugim przykładzie) pomiędzy dwoma datami. Do tego celu posłużymy się naszą tabelką prac.
Struktura DB wraz z przykładowymi danymi dla omawianych zagadnień znajduje się tutaj.
Dla przypomnienia, tak wygląda tabelka, na której przeprowadzimy nasze ćwiczenia:
mysql> select * from prac; +----+------------+------------+------------+---------+--------+-----------+ | id | nazwisko | stanowisko | data_zatr | wyplata | premia | id_dzialu | +----+------------+------------+------------+---------+--------+-----------+ | 1 | Kowalski | sprzedawca | 2005-07-13 | 1600 | 300 | 30 | | 2 | Malinowski | menadżer | 2005-09-13 | 2489 | 0 | 30 | | 3 | Grabski | analityk | 2006-07-15 | 1458 | 0 | 20 | | 4 | Bielecki | księgowy | 2006-03-12 | 1236 | 0 | 10 | | 5 | Kurtyka | dyrektor | 2006-04-17 | 11369 | 0 | 10 | | 6 | Dąbkowski | księgowy | 2002-04-13 | 1236 | 0 | 10 | | 7 | Kononowicz | analityk | 2006-04-11 | 3548 | 0 | 20 | | 8 | Janczak | księgowy | 2002-01-10 | 3699 | 0 | 10 | | 9 | Kamiński | sprzedawca | 2007-09-07 | 1365 | 658 | 30 | | 10 | Czechowski | analityk | 2009-01-03 | 3547 | 0 | 20 | | 11 | Duchnowski | sprzedawca | 2007-09-03 | 1687 | 356 | 30 | | 12 | Różański | sprzedawca | 2007-09-07 | 1999 | 200 | 30 | +----+------------+------------+------------+---------+--------+-----------+ 12 rows in set (0.00 sec)
1. Jak policzyć ilość kolejnych dni pomiędzy dwoma datami?
Do rozwiązania postawionego problemu przyda nam się wbudowana funkcja datediff(). W jednym zapytaniu pobieramy obie z interesujących nas dat (w tym przypadku daty zatrudnienia Kowalskiego i Malinowskiego) i podstawiamy je do wspomnianej funkcji:
mysql > SELECT ABS(DATEDIFF(kowalski_data,malinowski_data)) AS roznica FROM (SELECT data_zatr AS kowalski_data FROM prac WHERE nazwisko = 'Kowalski') X, (SELECT data_zatr AS malinowski_data FROM prac WHERE nazwisko = 'Malinowski') Y;
Wynik działania naszego zapytania:
+---------+ | roznica | +---------+ | 62 | +---------+ 1 row in set (0.00 sec)
Oczywiście z funkcji ABS() korzystamy po to, aby wynik naszych obliczeń był zawsze dodatni.
2. Jak policzyć ilość roboczych dni pomiędzy dwoma datami? Więcej…