Come informatici ci siamo dovuti confrontare con le date fin dai primi sviluppi di programmi con cui ci si divertiva a giocare per imparare. Le date sono elemento fondamentale per le nostre elaborazioni di dati, qualunque sia la categoria di business per cui lavoriamo. ERP, Documentali, BI, processi di produzione, sono solo esempi di aree in cui l'oggetto data risulta fondamentale.
Ovviamente i database ci sono sempre venuti in aiuto, dandoci innumerevoli funzionalità per poter manipolare le date in ogni loro sfumatura.
"DB2 for i" e il tipo DATE
Vediamo come il database integrato nel sistema IBM i (as/400) può aiutarci nel "giocare" con le date. Supponiamo di avere un file dove ogni record ha un campo di tipo DATE contenente appunto delle date. Il file si chiama tabSample ed è nella libreria mm
Supponiamo di usare un editor di query SQL via ODBC, ma potremmo anche utilizzare il comando interattivo STRSQL su emulazione 5250, oppure l'esecutore di script SQL integrato con l'Access Client Solution di IBM
Il nostro file è questo che vediamo come esempio, ogni record ha una colonna DATA di tipo date e contente un valore che rappresenta un giorno del calendario
come trovare il record con la data di oggi
SELECT * FROM mm.tabSample WHERE data = Current_Date
come trovare tutti i record del mese in corso
SELECT * FROM mm.tabSample WHERE month(data) >= month(Current_Date)
come trovare tutti i record di 4 giorni fa
SELECT * FROM mm.tabSample WHERE data = Current_Date - 4 Days
come trovare tutti i "primo giorno del mese"
SELECT data, monthname(data) FROM mm.tabSample WHERE DAY(data)='01'
come estrarre di quale giorno della settimana si tratta e il numero che rappresenta nell'anno
SELECT data, dayname(data), dayofyear(data) FROM mm.tabSample
come trovare quanti giorni di differenza ci sono per ogni data rispetto ad oggi
SELECT data, days(current_date) - days(data) FROM mm.tabSample
come trovare data e ora attuali del sistema
SELECT current_date, current_time FROM sysibm.sysdummy1
Altre funzionalità sulle date
IBM ha messo a disposizione moltissime altre funzionalità sul suo database DB2 per gestire le date. Eccone una lista che lavora anche sui tipi TIME e TIMESTAMP
DAYNAME Returns a mixed case character string containing the name of the day (e.g., Friday) for the day portion of the argument.
DAYOFWEEK Returns the day of the week in the argument as an integer value in the range 1-7, WHERE 1 represents Sunday.
DAYOFWEEK_ISO Returns the day of the week in the argument as an integer value in the range 1-7, WHERE 1 represents Monday.
DAYOFYEAR Returns the day of the year in the argument as an integer value in the range 1-366.
DAYS Returns an integer representation of a date.
JULIAN_DAY Returns an integer value representing the number of days FROM January 1, 4712 B.C. (the start of Julian date calendar) to the date value specified in the argument.
MIDNIGHT_SECONDS Returns an integer value in the range 0 to 86 400 representing the number of seconds between midnight and the time value specified in the argument.
MONTHNAME Returns a mixed case character string containing the name of month (e.g., January) for the month portion of the argument
TIMESTAMP_ISO Returns a timestamp value based on date, time or timestamp argument
TIMESTAMP_FORMAT Returns a timestamp FROM a character string that has been interpreted using a character template
TIMESTAMPDIFF Returns an estimated number of intervals of the type defined by the first argument, based on the difference between two timestamps
TO_CHAR Returns a character representation of a timestamp that has been formatted using a character template. TO_CHAR is a synonym for VARCHAR_FORMAT
TO_DATE Returns a timestamp FROM a character string that has been inter-preted using a character template. TO_DATE is a synonym for TIMESTAMP_FORMAT
WEEK Returns the week of the year of the argument as an integer value in range 1-54. The week starts with Sunday
WEEK_ISO Returns the week of the year of the argument as an integer value in the range 1-53
Date nel formato stringa YYYYMMDD
Quante volte però troviamo un campo data che in realtà è stato archiviato in formato stringa, il classico YYYYMMDD? Storicamente i programmi più datati usavano questo formato, che rendeva più semplice operazioni come l'ordinamento o la formattazione della stampa del valore. Ma con un campo data fatto così posso ancora manipolare le date con le funzioni del DB2? Certo che si, vediamo subito come l'operazione di CAST ci possa venire in aiuto
Supponiamo di avere un file dove ogni record ha un campo di tipo CHAR o VARCHAR contenente appunto delle date nel formato YYYYMMDD. Il file si chiama tabSample ed è nella libreria mm
Il nostro file è questo che vediamo come esempio, ogni record ha una colonna dataYYYYMMDD di tipo VARCHAR(14) e contente un valore che rappresenta un giorno del calendario nel formato YYYYMMDD
L'operatore di CAST di DB2 permette di convertire dei dati da un formato all'altro, se compatibili.
Sapendo quale deve esser ei formato ISO delle date, convertiamo la stringa in una data usando la seguente sintassi
SELECT dataYYYYMMDD, cast(substr(dataYYYYMMDD,1,4) || '-' || substr(dataYYYYMMDD,5,2) || '-' || substr(dataYYYYMMDD,7,2) as date) FROM mm.tabSample
A questo punto possiamo applicare tutti i precedenti esempi sulle date anche a questa tipologia di campo data nel formato stringa.
come trovare il record con la data di oggi
SELECT * FROM mm.tabSample WHERE cast(substr(dataYYYYMMDD,1,4) || '-' || substr(dataYYYYMMDD,5,2) || '-' || substr(dataYYYYMMDD,7,2) as date) = Current_Date
... e così via per tutti gli altri esempi
Abbiamo visto alcuni casi sul come possiamo manipolare le date con il database integrato dei sistemi IBM i. Ovviamente sul web troverete altri esempi e altre funzionalità sulle date, ma ora avrete una consapevolezza maggiore che con le date ci si può giocare e anche facilmente
Marco Moret Monitoring Project Manager presso smeup ICS
Puoi trovare l'articolo anche su LinkedIn