MainframeSupports
tip uge 46/2007:

Langt de fleste DB2 installationer opretter deres DB2 tabeller med en timestamp-kolonne, der angiver, hvornår den pågældende række blev oprettet eller sidst ændret. For at finde ud af, hvilke rækker i sådan en tabel, der blev oprettet på en bestemt dato, kan man udstede følgende SQL-kald:

SELECT *
FROM myTable
WHERE DATE(creationTimestamp) = :creationDate

Det kan jo næsten ikke være nemmere. Problemet er bare, at selvom der er et index på creationTimestamp, så vil DB2 ikke benytte det, selv ikke i DB2 version 8. Der er opfundet mange måder at omgå ovenstående problem og jeg vil komme med endnu en, som kun kræver et minimum af omskrivning af ovenstående SQL-kald:

SELECT *
FROM myTable
WHERE TRUNC_TIMESTAMP(creationTimestamp) = TIMESTAMP(:creationDate)

Under forudsætning af, at hostvariablen :creationDate er en CHAR(10) eller tilsvarende, så vil SQL-kaldet nu bruge et index, hvor creationTimestamp er den første kolonne i indexet. Hvorvidt dette kun gælder for version 8 ved jeg desværre ikke, da jeg ikke har adgang til version 7 længere.

Jeg havde ikke stødt på funktionen TRUNC_TIMESTAMP, før jeg blev voldsomt irriteret over, at DB2 ikke ville benytte indexet med DATE funktionen. I bare arrigskab prøvede jeg, og vupti det virkede. TRUNC_TIMESTAMP og dens fætter ROUND_TIMESTAMP er nogle sære funktioner, der kan trunkerere og afrunde timestamps. Jeg har ikke fundet nogen fornuftig anvendelse for nogen af dem før, ud over ovenstående trick, og heller ikke efter, nu hvor jeg kender deres eksistens. Rent faktisk er de kommet til allerede i version 7, hvilket bare viser, hvor svært det efterhånden er at følge med i alle ændringerne til DB2.

Forrige danske tip        Last tip in english        Tip oversigten