Infocurci - programmatore Php Roma
Infocurci - programmatore Php Roma
"faster than 98% of all tested websites" (tools.pingdom.com) - 100/100 Google PageSpeed Insights - Benvenuti :)

Mysql : Estrarre tutte le date valide

La classica clausola "where data is null" rischia di ritornare dei risultati inattesi. Nei campi "date" di mysql finiscono solo date formalmente valide (nessun febbraio con 30 giorni) ma questo non impedisce la presenza di date inesistenti ("lo zero aprile") oppure di date in formato "0000-00-00" che non sono considerate NULL. Ecco lo snippet che risolve il problema

Mysql

Quando in un database Mysql abbiamo un campo di tipo DATE ( o DATETIME ecc) il server rifiuta di inserire delle date inesistenti. La query

INSERT INTO tabella (campo_data) VALUES ("2019-02-29") 

restituisce il messaggio "Out of range value for column 'campo_data'", visto che il 2019 non è un anno bisestile.

Il campo viene cosi impostato al valore "0000-00-00". Tuttavia provando ad eseguire questa query:

INSERT INTO tabella  (campo_data) VALUES ("2019-00-29")

il dato viene tranquillamente memorizzato. Non si tratta di un bug, semplicemente mysql memorizza la data "mese di aprile 2019", senza un giorno specifico... ma questo non toglie che se dovessimo eseguire operazioni sulle date (ad esempio calcolare il numero di giorni passati), ci troveremmo davanti ad un valore ingestibile. Un datediff() restituirebbe valore NULL.

Ipotizzando ancora uno scenario in cui dovremmo lavorare solo su date congrue, anche il valore "0000-00-00" sarebbe problematico perchè verrebbe restituito come un NOT NULL,  per cui la query

SELECT * FROM tabella WHERE campo_data IS NOT NULL

ci restituirebbe anche gli "0000-00-00".

Ecco allora uno snippet che filtra tutti questi casi restituendo soltanto le date con un valore corretto:

SELECT * FROM tabella WHERE (campo_data IS NOT NULL AND UNIX_TIMESTAMP(campo_data) != 0 )

Grazie al filtro "IS NOT NULL"  togliamo di mezzo tutte le date con valore NULL; grazie a UNIX_TIMESTAMP != 0 togliamo tutte le date non valide, ovvero le "0000-00-00" e quelle che non specificano uno dei valori (nel nostro esempio, il giorno zero).