Archiwum: Luty 2010

Liczba dni (kolejnych / roboczych) pomiędzy dwiema datami

18-lut-10

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…