Riduciamo e ottimizziamo i tempi delle nostre attività

DB2 for i: gestire le date in SQL

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 Soluzioni EDP, gruppo smeup
 Puoi trovare l'articolo anche su LinkedIn


Tutti gli articoli
 JTOpen per ambienti .Net. La prima connessione JDBC da C#
 JTOpen per ambienti .Net
 DB2 for i: gestire le date in SQL
 Scaricare, installare e utilizzare i driver ODBC per IBM i
 Ottenere le info di sistema in SQL

Gestisci, analizza e controlla il sistema IBM i
Scarica, installa e lavora in pochi secondi
  os400 Monitoring Facility - Check è completamente gratuito fino a fine mese

facebook