Mam sql coś takiego:
SELECT EMP_NAME, DEPT
FROM EMPLOYEE
WHERE TIME_CREATED >= TO_DATE('26/JAN/2011','dd/mon/yyyy')
-> Zwraca 10 wierszy i TIME_CREATED = '26 -JAN-2011 '
Teraz, kiedy to robię, nie odzyskuję żadnych wierszy
SELECT EMP_NAME, DEPT
FROM EMPLOYEE
WHERE TIME_CREATED = TO_DATE('26/JAN/2011','dd/mon/yyyy')
-> Wziął większe niż na zewnątrz
Jakiś powód dlaczego?
sql
oracle
time
date-arithmetic
sanjeev40084
źródło
źródło
01
zamiastJAN
(plus oczywiście odpowiedni format), aby upewnić się, że twój kod działa bez problemów w każdym systemie.Odpowiedzi:
Tak: TIME_CREATED zawiera datę i godzinę . Użyj,
TRUNC
aby usunąć czas:SELECT EMP_NAME, DEPT FROM EMPLOYEE WHERE TRUNC(TIME_CREATED) = TO_DATE('26/JAN/2011','dd/mon/yyyy')
AKTUALIZACJA:
Jak zauważa Dave Costa w poniższym komentarzu, uniemożliwi to Oracle korzystanie z indeksu kolumny,
TIME_CREATED
jeśli istnieje. Alternatywnym podejściem bez tego problemu jest:SELECT EMP_NAME, DEPT FROM EMPLOYEE WHERE TIME_CREATED >= TO_DATE('26/JAN/2011','dd/mon/yyyy') AND TIME_CREATED < TO_DATE('26/JAN/2011','dd/mon/yyyy') + 1
źródło
BETWEEN TO_DATE('26/JAN/2011','dd/mon/yyyy') AND TO_DATE('26/JAN/2011','dd/mon/yyyy') + 1
?between
powodu niejednoznaczności. Brzmi to tak, jakby wyłączało granice, podczas gdy w rzeczywistości obejmuje. Dlatego tego unikam. Ponadto w tym konkretnym przykładzie nie byłoby to to samo.Możesz również użyć następujących elementów, aby uwzględnić część CZAS w zapytaniu:
SELECT EMP_NAME , DEPT FROM EMPLOYEE WHERE TIME_CREATED >= TO_DATE('26/JAN/2011 00:00:00', 'dd/mon/yyyy HH24:MI:SS');
źródło
Możesz też:
SELECT EMP_NAME, DEPT FROM EMPLOYEE WHERE TRUNC(TIME_CREATED) = DATE '2011-01-26'
źródło
Dzieje się tak, ponieważ
DATE
kolumna w Oracle zawiera również część czasu. Wynikiemto_date()
funkcji jest data z ustawioną godziną,00:00:00
dlatego prawdopodobnie nie pasuje ona do żadnych wierszy w tabeli.Powinieneś użyć:
SELECT EMP_NAME, DEPT FROM EMPLOYEE WHERE trunc(TIME_CREATED) = TO_DATE('26/JAN/2011','dd/mon/yyyy')
źródło
Jak skomentowały inne osoby powyżej, użycie TRUNC uniemożliwi użycie indeksów (jeśli indeks istniał na TIME_CREATED). Aby uniknąć tego problemu, zapytanie może mieć strukturę
SELECT EMP_NAME, DEPT FROM EMPLOYEE WHERE TIME_CREATED BETWEEN TO_DATE('26/JAN/2011','dd/mon/yyyy') AND TO_DATE('26/JAN/2011','dd/mon/yyyy') + INTERVAL '86399' second;
86399 to 1 sekunda mniej niż liczba sekund w ciągu dnia.
źródło