2013-07-04 17 views
15

Mi confondo sempre con il formato data nella query ORACLE SQL e trascorro i minuti insieme a google, Qualcuno può spiegarmi il modo più semplice di affrontare quando abbiamo un diverso formato di data nella tabella del database?Query Oracle Oracle per il formato data

per esempio ho una colonna data come ES_DATE, contiene dati come 27-APR-12 11.52.48.294030000 AM di Tipo dati TIMESTAMP (6) CON FUSO ORARIO LOCALE.

enter image description here

ho scritto semplice query di selezione per recuperare i dati per quel particolare giorno e mi restituisce nulla. Qualcuno mi può spiegare?

select * from table 
where es_date=TO_DATE('27-APR-12','dd-MON-yy') 

o

select * from table where es_date = '27-APR-12'; 

risposta

27

to_date() restituisce una data alle 00:00:00, quindi è necessario "rimuovere" i minuti a partire dalla data si confrontano a:

select * 
from table 
where trunc(es_date) = TO_DATE('27-APR-12','dd-MON-yy') 

Probabilmente vorresti creare un indice su trunc(es_date) se questo è qualcosa che stai facendo regolarmente.

Il letterale '27-APR-12' può non riuscire molto facilmente se il formato di data predefinito viene modificato in qualcosa di diverso. Quindi assicuratevi di utilizzare sempre to_date() con una maschera di formato corretto (o un ANSI letterale: date '2012-04-27')

Anche se hai fatto bene ad utilizzare to_date() e non basandosi su conversione del tipo di dati implict, l'utilizzo di TO_DATE() ha ancora un sottile trabocchetto a causa del formato 'dd-MON-yy'.

Con una diversa impostazione della lingua, questo potrebbe facilmente fallire per es. TO_DATE('27-MAY-12','dd-MON-yy') quando NLS_LANG è impostato su tedesco. Evita qualsiasi cosa nel formato che potrebbe essere diverso in una lingua diversa. Utilizzando un anno a quattro cifre e solo numeri, ad es. 'dd-mm-yyyy' o 'yyyy-mm-dd'

+0

@ user2246725: poi si sono non ci dicono tutto. Si prega di creare un semplice esempio su http://sqlfiddle.com che mostra il tuo problema. –

+0

@ user2246725: funziona per me: http://sqlfiddle.com/#!4/1eb57/5 –

+0

Non sto ottenendo i dati per la data esatta qui è: - 'Dove B.Timelog = to_date ('14 -Apr -17 ',' DD-MM-YY ') ' – BNN

1

Perché si passa la data come stringa?

io suggerisco di usare qualcosa come

Date myDate = new SimpleDateFormat("dd-MM-yy").parse("27-04-12"); 
java.sql.Date mySqlDate = new java.sql.Date(myDate.getTime()); 

e quindi modificare la query per utilizzare PreparedStatement invece

Connection conn = // get connection to db somehow 
PreparedStatement pst = conn.prepareStatement("select * from table 
where es_date = ?") 
pst.setDate(1, mySqlDate); 

ResultSet rs = pst.executeQuery(); 

Con questo, non c'è bisogno di ricordare i formati specifiche del database per le date .

+12

Perché pensi che la query venga eseguita da Java? –

2

se si utilizza lo stesso formato della data e dispone di query di selezione in cui la data in Oracle:

select count(id) from Table_name where TO_DATE(Column_date)='07-OCT-2015'; 

to_date fornito da Oracle