In questa lezione della nostra guida affronteremo un aspetto prevalentemente pratico, cioè come lavorare con date e orari in MySQL. Nello specifico vedremo come scrivere una data/orario all’interno di un campo e, successivamente, come effettuare la selezione di record in base a ricerche per data e/o orario.
Salvare una data o un orario all’interno di una tabella MySQL
E’ possibile scrivere una data o un orario all’interno di una tabella MySQL utilizzando una delle funzioni native per la gestione delle date e orari oppure inserendo manualmente il dato all’interno dell’apposito campo. Nel primo caso, ovviamente, non dovremo preoccuparci che la formattazione sia corretta in quanto verrà fatta automaticamente; viceversa, nel secondo caso (inserimento manuale) sarà importante accertarsi che il dato che andremo a crivere sia formattato in modo corretto rispetto alle specifiche del tipo di dato.
Salvare una data
Facciamo qualche esempio. Supponiamo di voler effettuare un inserimento in una tabella "diario" avente un campo "giorno" di tipo DATE:
INSERT INTO diario (giorno, note) VALUE (CURDATE(), '...');
Con la query vista sopra abbiamo utilizzato la funzione CURDATE() che stampa la data odierna nel formato AAAA-MM-GG.
Supponiamo ora di voler fare un inserimento manuale:
INSERT INTO diario (giorno, note) VALUE ('2021-01-05', '...');
Come potete vedere ho inserito il dato tra apici, come fosse una normale stringa di testo, seguendo la formattazione prevista per il campo di tipo DATE.
Una nota interessante: la funzione CURDATE() può essere utilizzata anche per popolare un campo di tipo YEAR, in tal caso MySQL, in automatico, scriverà unicamente l’anno corrente e non l’intera data, ovviamente.
Salvare sia la data che l’orario
Per la gestione di date e orari, MySQL, come sappiamo, mette a disposizione diversi tipi di dati, tra cui DATETIME.
Per i nostri esempi supporremo di avere a disposizione una tabella di nome "appuntamenti" avente un campo "quando" di tipo DATETIME.
Il primo esempio, il più semplice, prevede l’utilizzo della funzione nativa NOW():
INSERT INTO appuntamenti (quando, note) VALUE (NOW(), '...');
La funzione nativa NOW() inserirà il giorno ed orario corrente correttamente formattato (AAAA-MM-GG HH:MM:SS).
Anche in questo caso abbiamo la possibilità di scrivere manualmente il dato di nostro interesse avendo cura, ovviamente, di rispettare la giusta formattazione per questo tipo di dato:
INSERT INTO appuntamenti (quando, note) VALUE ('2021-01-05 11:10:53', '...');
Salvare un orario
Tra i vari tipi di dato esiste anche TIME il quale riguarda esclusivamente l’orario (non è prevista, in questo tipo di dato, la specifica della data).
Vediamo un esempio supponendo di avere a disposizione una tabella di nome "appuntamenti" avente un campo "orario" di tipo TIME.
INSERT INTO appuntamenti (orario, note) VALUE (CURTIME(), '...');
Con la query vista sopra abbiamo utilizzato la funzione CURTIME() che stampa l’orario attuale nel formato HH:MM:SS.
Anche in questo caso, ovviamente, potremo effettuare un inserimento manuale:
INSERT INTO appuntamenti (orario, note) VALUE ('11:10:53', '...');
Effettuare ricerche sulla base di date e orari
Ovviamente è possibile effettuare delle ricerche mediante la clausola WHERE al fine di selezionare determinati record sulla base di date e orari. Di seguito alcune delle casistiche più frequenti.
Selezionare un record in base ad una data
Vedaimo come trovare i record che corrispondono ad una data esatta.
Per i nostri esempi supponiamo di lavorare su una tabella "diario" avente un campo "giorno" di tipo DATE.
Per trovare i record corrispondenti alla data odierna useremo:
SELECT * FROM diario WHERE giorno = CURDATE();
Per trovare i record di una data arbitraria:
SELECT * FROM diario WHERE giorno = '2021-01-05';
Per trovare i record compresi tra una data di inizio ed una di fine:
SELECT * FROM diario WHERE giorno BEETWEN '2021-01-01' AND '2021-01-05;
In quest’ultimo esempio abbiamo utilizzato l’operatore BEETWEN per selezionare un range di valori compresi tra due date.
Nei tre esempi precedente abbiamo lavorato su un campo di tipo DATE… ma se avessimo avuto un campo di tipo DATETIME? Per questo esempio supponiamo di effettuare la stessa ricerca sulla tabella "appuntamenti" la quale dispone di un campo "quando" di tipo DATETIME.
SELECT * FROM appuntamenti WHERE DATE(quando) = '2021-01-05';
Come poetet vedere per effettuare la ricerca in base alla data ho utilizzato la funzione DATE() sul campo "quando" prima di verificare l’uguaglianza con la data utilizzata quale parametro di ricerca.
In modo meno ortodosso avremmo potuto ottenere il medesimo risultato utilizzando l’operatore LIKE in questo modo:
SELECT * FROM appuntamenti WHERE quando LIKE '2021-01-05%';
Le ultime due query, con qualche piccolo adattamento, possono essere utilizzate in una moltitudine di circostanze, ad esempio:
Trovare i record in base all’anno:
SELECT * FROM appuntamenti WHERE YEAR(quando) = '2021';
Trovare tutti i record di un dato mese di uno specifico anno:
SELECT * FROM appuntamenti WHERE quando LIKE '2021-01%';
Ecc.
Selezionare un record in base all’orario
Se all’interno di una tabella MySQL abbiamo a disposizione un campo contenente un orario (sia esse comporto con la data o isolato), potremo utilizzare questo dato per eseguire delle interrogazioni in grado di estrarre i record per un’ora specifica o per un range di orario.
Per fare un esempio faremo riferimento alla tabella "appuntamenti" la quale dispone di un campo "quando" di tipo DATETIME.
Supponiamo di voler estrarre dalla tabella tutti gli apountamenti, di un dato giorno, per le ore 19. Per farlo potremo usare una query come questa:
SELECT * FROM appuntamenti WHERE DATE(quando) = '2021-01-05' AND DATE_FORMAT(quando,"%H") = 19;
La funzione DATE_FORMAT() di MySQL si comporta infatti in modo molto simile alla funzione date() di PHP, essa accetta due argomenti: il primo ha come valore la data da formattare, il secondo rappresenta una stringa composta da caratteri speciali, preceduti dal simbolo "%" che indicano in che modo data vada formattata; nel caso specifico "%H" indica che la formattazione riguarda l’ora registrata.
In alternativa avremmo potuto utilizzare l’operatore BEETWEN per selezionare il range di orari che va dalle 19:00 alle 19:59; ad esempio:
SELECT * FROM appuntamenti WHERE DATE(quando) = '2021-01-05' AND TIME(quando) BETWEEN '19:00:00' AND '19:59:59';