Manipolare date e orari

Una delle “spine” di molti linguaggi di programmazione è la gestione delle date. Le date sono elementi sfuggenti e difficili da classificare, perché hanno significati diversi in diverse culture ed epoche storiche, perché la loro rappresentazione non è standardizzata, perché “12/2/2004” vuol dire 12 febbraio in Italia e 2 dicembre in America. Ce n’è a sufficienza per scoraggiare anche i programmatori più pazienti.

In MySQL, per ovviare a molti dei problemi sopra esposti, il formato delle date è standardizzato: “AAAA-MM-GG”, quindi il 12 febbraio si scrive “2004-02-12”, mentre il 2 dicembre è “2004-12-02”.

Può sembrare un aspetto negativo, specialmente per chi non è abituato a vedere le date in questo formato “alieno”, ma per un programmatore tale formato risolve diversi problemi, a parte il trattamento dei dati in modo univoco, c’è di buono che le date in questo formato si possono ordinare naturalmente, senza modifiche aggiuntive. Chiunque abbia provato a ordinare in sequenza temporale date in fromato “GG/MM/AAAA” sa di cosa sto parlando.

Ma gli aspetti positivi non finiscono qui. MySQL ha una caterva di funzioni per la gestione delle date. Quella più usata è DATE_FORMAT, che controlla il formato di date e orari.


mysql> select now();
+---------------------+
| now() |
+---------------------+
| 2004-04-21 17:30:18 |
+---------------------+


mysql> select date_format(now(),"%d-%b-%Y");
+-------------------------------+
| date_format(now(),"%d-%b-%Y") |
+-------------------------------+
| 21-Apr-2004 |
+-------------------------------+


mysql> select date_format(now(),"%M-%Y");
+----------------------------+
| date_format(now(),"%M-%Y") |
+----------------------------+
| April-2004 |
+----------------------------+


mysql> select date_format(now(),"%M, %d %Y");
+--------------------------------+
| date_format(now(),"%M, %d %Y") |
+--------------------------------+
| April, 21 2004 |
+--------------------------------+


mysql> select date_format(now(),"%M, %d %Y %h:%i%p");
+----------------------------------------+
| date_format(now(),"%M, %d %Y %h:%i%p") |
+----------------------------------------+
| April, 21 2004 05:32PM |
+----------------------------------------+


mysql> select date_format(now(),"%d-%b-%Y %H:%i");
+-------------------------------------+
| date_format(now(),"%d-%b-%Y %H:%i") |
+-------------------------------------+
| 21-Apr-2004 17:34 |
+-------------------------------------+

Le funzioni DATE_ADD e DATE_SUB possono aggiungere o sottrarre giorni, mesi o anni a una data, e restituire il risultato dell’operazione. Per esempio:


mysql> select curdate(), date_add(curdate(), interval 3 month);
+------------+---------------------------------------+
| curdate() | date_add(curdate(), interval 3 month) |
+------------+---------------------------------------+
| 2004-04-21 | 2004-07-21 |
+------------+---------------------------------------+

Ci sono poi funzioni per calcolare i giorni della settimana, la settimana dell’anno, il trimestre, le differenze fra due periodi, e tanto altro ancora. Questa è una sezione del manuale che merita di essere letta con attenzione nella sua interezza, perché ci può risparmiare parecchi fastidi la prossima volta che dobbiamo manipolare qualche data nei nostri programmi.