Oracle Data “Tra” Query
-
24-09-2019 - |
Domanda
Sto usando database Oracle. Io voglio eseguire una query per verificare i dati tra due date.
NAME START_DATE
------------- -------------
Small Widget 15-JAN-10 04.25.32.000000 PM
Product 1 17-JAN-10 04.31.32.000000 PM
select * from <TABLENAME> where start_date
BETWEEN '15-JAN-10' AND '17-JAN-10'
Ma non ottengo alcun risultato dall'alto query. Penso che devo usare "come" e "%". Ma non so dove usarli. Si prega di gettare qualche luce su questo.
grazie in anticipo.
Soluzione
A giudicare dalla tua uscita sembra aver definito START_DATE come timestamp. Se si trattasse di un appuntamento fisso Oracle sarebbe in grado di gestire la conversione implicita. Ma come non è necessario per lanciare in modo esplicito quelle stringhe di essere date.
SQL> alter session set nls_date_format = 'dd-mon-yyyy hh24:mi:ss'
2 /
Session altered.
SQL>
SQL> select * from t23
2 where start_date between '15-JAN-10' and '17-JAN-10'
3 /
no rows selected
SQL> select * from t23
2 where start_date between to_date('15-JAN-10') and to_date('17-JAN-10')
3 /
WIDGET START_DATE
------------------------------ ----------------------
Small Widget 15-JAN-10 04.25.32.000
SQL>
Ma siamo ancora solo ottenere una riga. Questo perché START_DATE ha un elemento di tempo. Se non specificare l'ora componente di Oracle di default esso a mezzanotte. Questo va bene per il da lato della BETWEEN
ma non per il fino a lato:
SQL> select * from t23
2 where start_date between to_date('15-JAN-10')
3 and to_date('17-JAN-10 23:59:59')
4 /
WIDGET START_DATE
------------------------------ ----------------------
Small Widget 15-JAN-10 04.25.32.000
Product 1 17-JAN-10 04.31.32.000
SQL>
modifica
Se non è possibile passare nel componente tempo ci sono un paio di scelte. Uno è quello di modificare la clausola WHERE per rimuovere l'elemento tempo dai criteri:
where trunc(start_date) between to_date('15-JAN-10')
and to_date('17-JAN-10')
Questo potrebbe avere un impatto sulle prestazioni, perché squalifica qualsiasi indice b-albero su START_DATE. Si avrebbe bisogno di costruire un indice basato su funzioni invece.
In alternativa si potrebbe aggiungere l'elemento tempo per la data nel codice:
where start_date between to_date('15-JAN-10')
and to_date('17-JAN-10') + (86399/86400)
A causa di questi problemi molte persone preferiscono evitare l'uso di between
controllando data confini in questo modo:
where start_date >= to_date('15-JAN-10')
and start_date < to_date('18-JAN-10')
Altri suggerimenti
È necessario convertire quelle specifiche date più sotto, invece di stringhe, provate questo:
SELECT *
FROM <TABLENAME>
WHERE start_date BETWEEN TO_DATE('2010-01-15','YYYY-MM-DD') AND TO_DATE('2010-01-17', 'YYYY-MM-DD');
A cura di trattare con il formato come specificato:
SELECT *
FROM <TABLENAME>
WHERE start_date BETWEEN TO_DATE('15-JAN-10','DD-MON-YY') AND TO_DATE('17-JAN-10','DD-MON-YY');
Come APC ha giustamente sottolineato, la colonna start_date sembra essere una TIMESTAMP ma potrebbe essere una data con fuso orario locale o TIMESTAMP WITH TIMEZONE tipo di dati troppo. Questi potrebbero anche influenzare qualsiasi domanda si stava facendo sui dati se il server database, era in un fuso orario diverso da te stesso. Tuttavia, cerchiamo di mantenere questo semplice e presuppongono che si trova nella stessa fuso orario come server. In primo luogo, per darvi la fiducia, verificare che il data_iniziale è un tipo di dati TIMESTAMP.
Con i SQLPlus comando DESCRIBE (o l'equivalente in vostro IDE) per verificare questa colonna è un tipo di dati TIMESTAMP.
es
DESCRIVERE MyTable
relazione dovrebbe:
Name Null? Type
----------- ----- ------------
NAME VARHAR2(20)
START_DATE TIMESTAMP
Se viene segnalato come un tipo = TIMESTAMP allora si può interrogare i tuoi intervalli di date con più semplice TO_TIMESTAMP conversione della data, quella che richiede alcun argomento (o immagine).
Usiamo TO_TIMESTAMP per garantire che qualsiasi indice sulla colonna START_DATE è considerata dal ottimizzatore. La risposta di APC ha osservato, inoltre, che un indice basato funzione potrebbe essere stato creato su questa colonna e che avrebbe influenzato il predicato SQL, ma non possiamo commentare su che in questa query. Se volete sapere come scoprire che cosa sono stati applicati gli indici a tavola, inviare un'altra domanda e possiamo rispondere a questa parte.
Quindi, supponendo che non v'è un indice su data_iniziale, che è un tipo di dati TIMESTAMP e si desidera l'ottimizzatore di prendere in considerazione, il vostro SQL sarebbe:
select * from mytable where start_date between to_timestamp('15-JAN-10') AND to_timestamp('17-JAN-10')+.9999999
+. 999.999.999 è molto vicino ma non è proprio così 1 la conversione di 17-gen-10 sarà il più vicino a mezzanotte di quel giorno il più possibile, quindi si query restituisce entrambe le righe.
La banca dati vedrà il TRA come da 15-gen-10 00: 00: 00: 0000000 a 17-GEN-10 23: 59: 59: 99999 e sarà quindi comprendere tutte le date dal 15, 16 e 17 gennaio, 2010 qualunque sia la componente temporale del timestamp.
La speranza che aiuta.
Dazzer
Data dell'asta Tra Query
SELECT *
FROM emp
WHERE HIREDATE between to_date (to_char(sysdate, 'yyyy') ||'/09/01', 'yyyy/mm/dd')
AND to_date (to_char(sysdate, 'yyyy') + 1|| '/08/31', 'yyyy/mm/dd');
A seguito di richiesta può anche essere utilizzato:
select *
from t23
where trunc(start_date) between trunc(to_date('01/15/2010','mm/dd/yyyy')) and trunc(to_date('01/17/2010','mm/dd/yyyy'))