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.

È stato utile?

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'))
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top