MainframeSupports
tip uge 41/2004:

Nogen gange kan jeg godt blive ret overrasket over hullerne i min viden om DB2. Derfor kan det godt være, at der ikke er meget nyt for dig i denne uges tip. Det handler om dato-formater i DB2. I min grænseløse naivitet troede jeg indtil for nylig, at DB2 som input kun accepterede et dato-format styret af en parameter i DSNZPARM eller til pre-compileren. Jeg vidste jo godt, at DB2 kan håndtere fem dato-formater, nemlig ISO og JIS, som er ens (YYYY-MM-DD), EUR (DD.MM.YYYY), USA (MM/DD/YYYY) og LOCAL, som man selv definerer vha. et DB2-exit. At alle formaterne kan benyttes samtidigt var dog ikke gået op for mig. Prøv for eksempel følgende SQL-kald på din installation:

SELECT DATE('9999-12-31')
     , DATE('31.12.9999')
     , DATE('12/31/9999')
FROM SYSIBM.SYSDUMMY1
WHERE CURRENT DATE > '2001-1-9'
  AND CURRENT DATE > '9.1.2001'
  AND CURRENT DATE > '1/9/2001'

De sidste 15 år ville jeg have væddet med hvem som helst om, at ovenstående SQL-kald ville fejle (hvis vi ser bort fra, at SYSIBM.SYSDUMMY1 ikke har eksisteret så længe). Det gør det bare ikke. Selv foranstillede nuller i dag og måned behøver man ikke at angive. Sådan har det været længere tilbage i DB2 end jeg umiddelbart kan finde ud af. Måske blev dato håndteringen født sådan tilbage i version 1.3.

Ovenstående SQL-kald returnerer de samme tre datoer på samme format, nemlig det format, som er default på din installation. Men man kan faktisk kontrollere output formatet fra dato til dato med CHAR-funktionen eller man kan styre det på package/DBRM-niveau. Lad os tage CHAR-funktionen først:

SELECT CHAR(DATE('9999-12-31'), ISO)
     , CHAR(DATE('9999-12-31'), EUR)
     , CHAR(DATE('9999-12-31'), USA)
     , CHAR(DATE('9999-12-31'), LOCAL)
FROM SYSIBM.SYSDUMMY1

Måske fejler ovenstående SQL-kald på din installation. Så skyldes det, at dato DB2-exit'et ikke er aktiveret. Erstat LOCAL med JIS og prøv igen. Højst sandsynligt er formatet for LOCAL magen til en af de tre andre formater, men enkelte installationer har defineret deres eget output-format. I øvrigt kan et LOCAL input-format være forskelligt fra LOCAL output-formatet, selv om det ikke er ret sandsynligt i praksis.

Man kan give pre-compileren en option kaldet DATE(<dato-format>), som sørger for, at output-formatet for datoer i det pågældende program bliver i det angivne format, når man ikke bruger CHAR-funktionen. Mange installationer benytter et source-styringsværktøj, hvor options til DB2 pre-compileren sandsynligvis skal angives på en speciel måde. Her bliver du nødt til at spørge dig frem i din organisation, hvis du vil benytte DATE-optionen til pre-compileren.

Forrige danske tip        Last tip in english        Tip oversigten