DOMANDA: Perché è compreso SQL TRA?
RISPOSTA: poiché i progettisti del linguaggio SQL hanno preso una cattiva decisione di progettazione, in quanto non sono riusciti a fornire la sintassi che avrebbe consentito agli sviluppatori di specificare quale delle 4 varianti di BETWEEN (chiusa, semi-aperta-sinistra, semi-aperta-destra o aperta ) preferirebbero.
RACCOMANDAZIONE: A meno che / fino a quando non viene modificato lo standard SQL, non utilizzare TRA date / orari. Prendi invece l'abitudine di codificare i confronti dell'intervallo DATE come condizioni indipendenti sui limiti iniziale e finale dell'intervallo TRA. Questo è un po 'dettagliato, ma ti lascerà a scrivere condizioni intuitive (quindi meno probabili da errori) e chiare agli ottimizzatori del database, consentendo di determinare piani di esecuzione ottimali e utilizzare gli indici.
Ad esempio, se la tua query accetta una specifica del giorno di input e deve restituire tutti i record che rientrano in tale data, codifichi come:
WHERE DATE_FIELD >= :dt AND DATE_FIELD < :dt+1
Cercare di scrivere la logica usando TRA rischi di prestazioni e / o codice errato. Tre passi falsi comuni:
1) WHERE DATE_FIELD BETWEEN :dt AND :dt+1
Questo è quasi certamente un bug: l'utente si aspetta di vedere solo i record per una determinata data, ma un giorno finirà con un rapporto contenente i record delle 12:00 del giorno successivo.
2) WHERE TRUNC(DATE_FIELD) = :dt
Fornisce la risposta giusta, ma l'applicazione della funzione a DATE_FIELD renderà inutile gran parte dell'indicizzazione / delle statistiche (anche se a volte i DBA cercheranno di aiutare aggiungendo indici basati sulle funzioni ai campi della data - bruciando ancora ore-uomo e spazio su disco e aggiungendo overhead a IUD operazioni sul tavolo)
3) WHERE EVENT_DATE BETWEEN :dt AND :dt + 1-1/24/60/60
Tom Kyte, straordinario guru di Oracle, consiglia questa soluzione tutt'altro che elegante (IMO). Funziona alla grande finché non passi tutto il giorno a scoprire che "1-1 / 24/06/60" in una query che fornisce risultati incompleti ... o fino a quando non lo usi accidentalmente su un campo TIMESTAMP. Inoltre, è un po 'proprietario; compatibile con il tipo di dati DATE di Oracle (che tiene traccia del secondo), ma deve essere adattato alla precisione DATE / TIME dei diversi prodotti di database.
SOLUZIONE: presentare una petizione al comitato SQL ANSI per migliorare le specifiche del linguaggio SQL modificando la sintassi TRA per supportare la specifica delle alternative al valore predefinito CHIUSO / INCLUSIVO. Qualcosa del genere farebbe il trucco:
expr1 TRA espr2 [ INCL [USIVE] | EXCL [USIVE]] E expr3 [ INCL [USIVE] | EXCL [USIVE]]
Considera quanto diventa facile esprimere WHERE DATE_FIELD BETWEEN :dt INCLUSIVE AND :dt+1 EXCLUSIVE
(o solo WHERE DATE_FIELD BETWEEN :dt AND :dt+1 EXCL
)
Forse ANSI SQL: 2015?