2010-06-08 13 views
7
updated_date = 08-Jun-2010; 

Mam zapytanie jak tenmniejsza lub równa w Oracle SQL

select * from asd whre updated_date <= todate('08-Jun-2010', 'dd-MM-yy'); 

ale ja nie otrzymuję żadnych wyników. działa tylko wtedy, gdy todate jest 09-cze-2010 ...

tj. mój operator equalto nie działa poprawnie.

Dlaczego tak jest?

Odpowiedz

21

W Oracle termin DATA jest punktem w czasie. Zawsze ma komponent czasu z dokładnością do sekundy. todate('08-Jun-2010', 'dd-Mon-yyyy') jest w Oracle taki sam jak todate('08-Jun-2010 00:00:00', 'dd-Mon-yyyy hh24:mi:ss'). Jeśli więc wybierzesz wiersze do tej daty, nie otrzymasz żadnego wiersza tego dnia z komponentem czasu równym 00:00.

Jeśli chcesz wybrać wszystkie wiersze włącznie 08-JUN-2010, proponuję przy użyciu:

< to_date('09-06-2010', 'dd-MM-yyyy') 

lub

<= to_date('08-06-2010 23:59:59', 'dd-MM-yyyy hh24:mi:ss') 

Uwaga - poprawiłam swój format daty: trzeba używać numeru MON, jeśli chcesz użyć nazwy skróconego miesiąca. Proponuję zamiast tego użyć MM, aby uniknąć błędu, gdy ktoś zmieni ustawienia klienta (NLS_DATE_LANGUAGE). Również preferuj użycie YYYY zamiast YY.

+1

myślę Nazwa skrócona formacie miesiąc jest „MON” nie „MMM” – Sujee

+0

+1 do przyczyny zastosowania „skrócona nazwa miesiąca” format „MM” zamiast. – Sujee

+0

@Sujee: dzięki, zaktualizowałem swoją odpowiedź –

13

Sprawdź to,

select to_date('08-Jun-2010', 'dd-MON-yyyy') from dual; 

Jest równa 2010-06-08 00:00:00. Zwróć uwagę na czas.

Część updated_date ma część czasową. Aby włączyć je, należy użyć tej kwerendy,

select * from asd where trunc(updated_date) <= to_date('08-Jun-2010', 'dd-MON-yyyy'); 

Domyślna TRUNC funkcję data parametru usunie czas.

Patrz Trunc