I campi data numerici a sette cifre (1260727 per il 27 luglio 2026) si convertono senza
scomporre nulla, sfruttando il fatto che il "secolo" vale 0 per il Novecento e 1 dal Duemila.
SELECT DATE(TIMESTAMP_FORMAT(DIGITS(DEC(DTACYY + 19000000, 8, 0)), 'YYYYMMDD'))
FROM PRODLIB/ORDINI
Sommando 19000000 il numero diventa già la data in formato YYYYMMDD: 1260727 diventa
20260727, e 0991231 diventa 19991231.
Per proteggersi dalle date a zero, che in questi campi sono la norma quando il valore non è ancora stato impostato:
SELECT CASE WHEN DTACYY = 0 THEN NULL
ELSE DATE(TIMESTAMP_FORMAT(DIGITS(DEC(DTACYY + 19000000, 8, 0)), 'YYYYMMDD'))
END AS DATA_ORDINE
FROM PRODLIB/ORDINI
Esempio: il filtro che spegne l'indice
Questa è la parte che costa tempo vero, e non si vede finché il file non diventa grande.
Filtrare sulla data convertita sembra naturale e obbliga il database a convertire ogni
riga prima di poterla scartare. L'indice su DTACYY, se c'è, non viene usato:
-- lento: la conversione sta a sinistra del confronto
WHERE DATE(TIMESTAMP_FORMAT(DIGITS(DEC(DTACYY + 19000000, 8, 0)), 'YYYYMMDD'))
BETWEEN '2026-01-01' AND '2026-12-31'
La stessa selezione, con il confronto sul numero grezzo, lascia la colonna intatta e l'indice utilizzabile:
-- veloce: la colonna resta com'è, i limiti sono già in CYYMMDD
WHERE DTACYY BETWEEN 1260101 AND 1261231
La conversione serve per mostrare la data, non per cercarla. La regola vale oltre questo
caso: qualunque funzione applicata alla colonna nel WHERE (non solo questa) impedisce
l'uso dell'indice su quella colonna.
Attenzione
senza il controllo sullo zero la conversione fallisce e la query si ferma sull'intero risultato, non sulla singola riga. È il motivo per cui una query che funzionava smette di funzionare il giorno in cui entra il primo record senza data.
Nota
la stessa espressione non vale per i campi a sei cifre YYMMDD, che non hanno il
secolo: lì quale secolo intendere è una decisione dell'applicazione, non del database.
Rilasci. TIMESTAMP_FORMAT, DIGITS e DEC sono funzioni SQL standard, presenti su
tutti i rilasci supportati. Questa ricetta non ha prerequisiti.
Commenti
Nessun commento ancora. Sii il primo a commentare!
Devi avere un account per commentare. Accedi · Registrati