Funzione LAST_DAY() per FineMese
Gli argomenti di questa pagina
|
Calcolo di fine mese con la funzione LAST_DAY()
La funzione MySQL LAST_DAY() restituisce l'ultimo giorno del mese corrispondente per una data o un valore datetime. Se il valore di data o datetime non è valida, la funzione restituisce NULL.
La sintassi è semplice:
La funzione LAST_DAY() restituisce la data completa della fine del mese nel formato AAAA-MM-GG. Perciò, se vogliamo la data formattata in modo diverso o se vogliamo solo il giorno è necessario avvalersi di altre funzioni come nell'esempio.
Cerca l'ultimo del mese delle date di nascita con la funzione LAST_DAY()
esempio 1
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
101 record trovati 15 record visualizzati
|
FineMese con funzioni DATE_ADD e DATE_SUB
Se vogliamo avventurarci nella programmazione avanzata possiamo fare uso delle funzioni DATE_ADD e DATE_SUB.
Da quel che ho visto girando in giro, MYSQL, nonostante la schiera di funzioni che ha per la gestione dei mesi, non sembra avere una funzione per calcolare la fine del mese.
Per questo motivo ho cercato di vedere se, usando le sue funzioni native, potessi arrivare ad ottenere questo risultato.
Il ragionamento che ho seguito per raggiumgere lo scopo è questo e rispettando la sequenza:
- trovo il primo del mese della data in esame con la funzione DATE_FORMAT('2014-02-15', '%Y-%m-%01')
se nella stringa di formattazione usata con la funzione DATE_FORMAT() inserisco una stringa letterale che non è compresa tra i valori predefiniti, questa stringa rimane invariata, quindi se al posto di %d metto una qualsiasi altra stringa (%01) questa rimane ed entra nella stringa restituita dalla funzione. - aggiumgo un mese alla data trovata con DATE_ADD( '2014-01-31', INTERVAL 1 MONTH )
- tolgo un giorno per spostarmi alla fine del mese precedente con DATE_SUB( '2014-02-01', INTERVAL 1 DAY )
se riuscissi a nidificare tutte queste funzioni in una istruzione SELECT (o anche in una WHERE) raggiungo l'obiettivo che mi son posto.
E' quel che cerco di fare in questo esempio ed il risultato che si vede è ottenuto eseguendo l'ultima Query.
Nella istruzione illustrata qui sotto sembra che la sequenza appena descritta sia invertita. Invece, quando le funzioni sono nidificate (qui sotto le funzioni nidificate sono tre, ma nella Query finale sono ben quattro) la loro esecuzione avviene da quella più interna andando via via verso quella più esterna.
che così è formulato:
DATE_SUB( DATE_ADD( DATE_FORMAT( '2014-03-15', '%Y-%m-%01' ) , INTERVAL 1 MONTH ) , INTERVAL 1 DAY )
Le altre
righe le ho lasciate solo a scopo chiarificativo.
Per molteplici funzioni nidificate la prima ad essere eseguita è la più interna e via via si sale all più esterna.
Quindi, nel nostro esempio le funzioni vengono eseguite in questa sequenza:
- DATE_FORMAT('2014-02-15', '%Y-%m-%01')
- DATE_ADD( risultato della funzione DATE_SUB , INTERVAL 1 MONTH )
- DATE_SUB( risultato della funzione DATE_FORMAT, INTERVAL 1 DAY )
Esempio con una data arbitraria
Stabilita una data arbitraria, trovare: l'inizio del mese, il mese successivo, il giorno precedente e l'ultimo del mese
esempio 2
|
||||||||||
1 record letti
|
Esempio su una tabella reale del DB
Ora vediamo lo stesso calcolo in azione su una vera tabella MYSQL. In questo caso ho allungato l'output del resultset per eseguire un esame più completo su ciò che restituisce l'istruzione.
In questa Query:
- Nella prima riga, subito dopo la clausola SELECT, chiamo le colonne id, cognome e nome.
- Nella seconda riga chiamo la colonna data_nascita formattata in maniera adeguata per conoscere la data su cui andremo a lavorare.
- La terza riga è fondamentalmente quella che dovrebbe restituire l'ultimo giorno del mese ed in genere vediamo che lo restituisce. Tuttavia vediamo che restiutisce alcune incoerenze in corrispondenza di alcuni mesi.
- Nella quarta riga della Query ho cercato di modificare l'istruzione della terza riga invertendo la funzione DATE_ADD() con la funzione DATE_SUB() mantenendo per ciascuna gli argomenti "INTERVAL 1 DAY" associato a "DATE_SUB" e "INTERVAL 1 MONTH" associato a "DATE_ADD".
Perciò sembra che questa sia la giusta sequenza per ottenere la giusta fine del mese.
Ed ora la Query finale
Cerca la fine del mese delle date di nascita con la funzione DATE_ADD()
esempio 3
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
101 record trovati 15 record visualizzati
|