Convertire una data CYYMMDD in SQL

Accedi per salvare

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.

← Torna al blog

Commenti

Nessun commento ancora. Sii il primo a commentare!

Devi avere un account per commentare. Accedi · Registrati