2013-07-04 9 views
15

Zawsze mylę się z formatem daty w zapytaniu SQL ORACLE i spędzam minuty razem na google, Czy ktoś może wytłumaczyć mi najprostszy sposób rozwiązania problemu, gdy mamy inny format daty w tabeli bazy danych?Zapytanie Oracle dla formatu Data

Na przykład mam kolumnę daty jako ES_DATE, przechowuje dane jako 27-APR-12 11.52.48.294030000 AM danych Typ TIMESTAMP (6) Z LOKALNEJ STREFY CZASOWEJ.

enter image description here

napisałem prostą kwerendę wybierającą do pobierania danych dla danego dnia i zwraca mi nic. Czy ktoś może mi wyjaśnić?

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

lub

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

Odpowiedz

27

to_date() zwraca datę w 00:00:00, więc trzeba "usunąć" z minuty od daty porównujesz do:

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

Prawdopodobnie chcesz utworzyć indeks na trunc(es_date), jeśli jest to coś, co robisz regularnie.

Dosłowne '27-APR-12' może bardzo łatwo zepsuć się, jeśli domyślny format daty zostanie zmieniony na inny. Więc upewnij się, że zawsze używać to_date() z odpowiednią maską formatu (lub ANSI dosłowny: date '2012-04-27')

Chociaż zrobiłeś prawo w użyciu to_date() a nie opierając się na danych typu implict konwersji swoje wykorzystanie TO_DATE() nadal ma subtelna pułapka ze względu na format 'dd-MON-yy'.

Przy innym ustawieniu języka może to łatwo zakończyć się niepowodzeniem, np. TO_DATE('27-MAY-12','dd-MON-yy'), gdy NLS_LANG jest ustawiony na niemiecki. Unikaj niczego w formacie, który może być inny w innym języku. Używanie czterocyfrowych numerów rocznych i tylko np. 'dd-mm-yyyy' lub 'yyyy-mm-dd'

+0

@ user2246725: to jesteś nie mówi nam wszystkiego. Utwórz prosty przykład na http://sqlfiddle.com, który pokazuje Twój problem. –

+0

@ user2246725: działa dla mnie: http://sqlfiddle.com/#!4/1eb57/5 –

+0

Nie otrzymuję danych dla dokładnej daty tutaj: - 'Where B.Timelog = to_date ('14 -Apr -17 ',' DD-MM-RR ') ' – BNN

1

Dlaczego przekazujesz datę jako ciąg?

Proponuję użyć czegoś jak

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

a następnie zmodyfikować zapytanie do korzystania PreparedStatement zamiast

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(); 

Dzięki temu nie trzeba pamiętać formatów baz danych specyficznych dla dat .

+12

Dlaczego sądzisz, że zapytanie jest uruchamiane z języka Java? –

2

jeśli używasz tego samego formatu daty i mieć kwerendę wybierającą gdzie data w oracle:

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

TO_DATE dostarczane przez Oracle