Jak sprawdzić czy dany rok jest rokiem przestępnym?

Jednym z najprostszych rozwiązań z jakimi się zetknąłem było sprawdzenie ostatniego dnia lutego.

Powyższy problem rozwiązujemy korzystając z tak zbudowanego zapytania:

SELECT
  DAY( LAST_DAY( DATE_ADD( DATE_ADD( DATE_ADD( CURRENT_DATE, INTERVAL - DAYOFYEAR( CURRENT_DATE ) DAY ), INTERVAL 1 DAY ), INTERVAL 1 MONTH ) ) ) AS wynik;

Ale od początku, rozbierzmy to zapytanie na części pierwsze :)

Na początek powinniśmy określić ostatni dzień zeszłego roku ..

mysql> SELECT
    ->   DATE_ADD( CURRENT_DATE, INTERVAL - DAYOFYEAR( CURRENT_DATE ) DAY ) AS wynik;
+------------+
| wynik      |
+------------+
| 2008-12-31 |
+------------+
1 row in set (0.00 sec)

.. dodajmy 1 dzień i w ten sposób znajdujemy pierwszy dzień bieżącego roku ..

mysql> SELECT
    ->   DATE_ADD( DATE_ADD( CURRENT_DATE, INTERVAL - DAYOFYEAR( CURRENT_DATE ) DAY ), INTERVAL 1 DAY ) AS wynik;
+------------+
| wynik      |
+------------+
| 2009-01-01 |
+------------+
1 row in set (0.00 sec)

.. analogicznie do poprzedniego zapytania, dodajemy 1 miesiąc (docierając w ten sposób do lutego b.r.) ..

mysql> SELECT
    ->   DATE_ADD( DATE_ADD( DATE_ADD( CURRENT_DATE, INTERVAL - DAYOFYEAR( CURRENT_DATE ) DAY ), INTERVAL 1 DAY ), INTERVAL 1 MONTH ) AS wynik;
+------------+
| wynik      |
+------------+
| 2009-02-01 |
+------------+
1 row in set (0.00 sec)

.. sprawdzamy jaki dzień był ostatnim dniem lutego ..

mysql> SELECT
    ->   LAST_DAY( DATE_ADD( DATE_ADD( DATE_ADD( CURRENT_DATE, INTERVAL - DAYOFYEAR( CURRENT_DATE ) DAY ), INTERVAL 1 DAY ), INTERVAL 1 MONTH ) ) AS wynik;
+------------+
| wynik      |
+------------+
| 2009-02-28 |
+------------+
1 row in set (0.00 sec)

.. ponieważ potrzebny nam jest tylko dzień, ostatni raz modyfikujemy nasze zapytanie:

mysql> SELECT
    ->   DAY( LAST_DAY( DATE_ADD( DATE_ADD( DATE_ADD( CURRENT_DATE, INTERVAL - DAYOFYEAR( CURRENT_DATE ) DAY ), INTERVAL 1 DAY ), INTERVAL 1 MONTH ) ) ) AS wynik;
+-------+
| wynik |
+-------+
|    28 |
+-------+
1 row in set (0.00 sec)

Dalsze postępowanie jest już oczywiste, jeśli wynikiem działania naszego zapytania jest „28″ rok nie jest rokiem przestępnym, jeśli „29″ to rok jest rokiem przestępnym.

Nic nie stoi na przeszkodzie, by powyższą klauzulę wzbogacić o wyrażenie warunkowe CASE tak by zwracała konkretną odpowiedź na postawione przez nas pytanie. Jednak użycie wyrażenia CASE będzie tematem osobnego wpisu.

Zachęcam do bliższego zapoznania się z funkcjami: DATE_ADD(), LAST_DAY() oraz DAY() a także CURRENT_TIME. Opis wszystkich funkcji wraz z przykładami użycia znajduje się pod tym adresem www.

Jeden komentarz

  1. Bardzo ciekawie prowadzony blog, przyjemnie się go czyta :-)

    Wytrwałości w pisaniu!

    Pozdrawiam

    Opublikowano 27 wrz 09 o 20:47 | Bezpośredni link

Napisz komentarz

Twój email nigdy nie zostanie opublikowany. Pola wymagane zostały oznaczone przez *
*
*