Monday, 12 July 2010

Selezione di un range di date

Nel caso in cui serva estrarre da una relazione delle tuple che contengano esattamente un range di date di nascita, può essere più efficiente utilizzare funzioni native SQL/MySQL invece di usare un codice ogni volta personalizzato (ovvero: scriverlo da zero).

Si suppone che si abbia bisogno di distinguere range di 5 anni. Il codice risulterà questo:

(SELECT
        SUM(CASE WHEN  data_nascita < NOW() THEN 1 END) AS tutti,
        SUM(CASE WHEN DATE_ADD(data_nascita, INTERVAL '5' YEAR) < NOW() AND DATE_ADD(data_nascita, INTERVAL '10' YEAR) >= NOW() THEN 1 ELSE 0 END) AS 5_9,
        SUM(CASE WHEN DATE_ADD(data_nascita, INTERVAL '10' YEAR) < NOW() AND DATE_ADD(data_nascita, INTERVAL '15' YEAR) >= NOW() THEN 1 ELSE 0 END) AS 10_14,
        SUM(CASE WHEN DATE_ADD(data_nascita, INTERVAL '15' YEAR) < NOW() AND DATE_ADD(data_nascita, INTERVAL '20' YEAR) >= NOW() THEN 1 ELSE 0 END) AS 15_19,
        SUM(CASE WHEN DATE_ADD(data_nascita, INTERVAL '20' YEAR) < NOW() AND DATE_ADD(data_nascita, INTERVAL '25' YEAR) >= NOW() THEN 1 ELSE 0 END) AS 20_24,
        SUM(CASE WHEN DATE_ADD(data_nascita, INTERVAL '25' YEAR) < NOW() AND DATE_ADD(data_nascita, INTERVAL '30' YEAR) >= NOW() THEN 1 ELSE 0 END) AS 25_29,
        SUM(CASE WHEN DATE_ADD(data_nascita, INTERVAL '30' YEAR) < NOW() AND DATE_ADD(data_nascita, INTERVAL '35' YEAR) >= NOW() THEN 1 ELSE 0 END) AS 30_34,
        SUM(CASE WHEN DATE_ADD(data_nascita, INTERVAL '35' YEAR) < NOW() AND DATE_ADD(data_nascita, INTERVAL '40' YEAR) >= NOW() THEN 1 ELSE 0 END) AS 35_39,
        SUM(CASE WHEN DATE_ADD(data_nascita, INTERVAL '40' YEAR) < NOW() AND DATE_ADD(data_nascita, INTERVAL '45' YEAR) >= NOW() THEN 1 ELSE 0 END) AS 40_44,
        SUM(CASE WHEN DATE_ADD(data_nascita, INTERVAL '45' YEAR) < NOW() AND DATE_ADD(data_nascita, INTERVAL '50' YEAR) >= NOW() THEN 1 ELSE 0 END) AS 45_49,
        SUM(CASE WHEN DATE_ADD(data_nascita, INTERVAL '50' YEAR) < NOW() AND DATE_ADD(data_nascita, INTERVAL '55' YEAR) >= NOW() THEN 1 ELSE 0 END) AS 50_54,
        SUM(CASE WHEN DATE_ADD(data_nascita, INTERVAL '55' YEAR) < NOW() AND DATE_ADD(data_nascita, INTERVAL '60' YEAR) >= NOW() THEN 1 ELSE 0 END) AS 55_59,
        SUM(CASE WHEN YEAR(data_nascita) <= YEAR(CURDATE())-60 THEN 1 ELSE 0 END) AS over_60
        FROM tab_utenti
        WHERE attivo='1')

Post a Comment