String na datę z podzapytaniem

0

Witam,

Nie jestem orłem w SQL i mam wydaje się banalny problem.
Mam w Oracle tabelę w której jest pole DATA_WPLYWU (varchar). Są tam wartości typu '2016-04-01 0000' ale w kilku rekordach jest wstawione 'None'.
Chce wyświetlić te rekordy, które mają w kolumnie DATA_WPLYWU datę późniejszą niż 2016/06/30.

Utworzyłem zapytanie:

SELECT *
FROM
(select * from rejestr where data_wplywu!='None') NOWA
WHERE to_date(NOWA.data_wplywu,'YYYY-MM-DD hh24ss')>'16/06/30'

ale otrzymuję błąd:
QL Error: ORA-01841: (pełny) rok musi pochodzić z zakresu od -4713 do +9999 i nie może być 0
01841. 00000 - "(full) year must be between -4713 and +9999, and not be 0"
*Cause: Illegal year entered
*Action: Input year in the specified range

Nie wiem dlaczego przecież warunek:
to_date(aa.data_wplywu,'YYYY-MM-DD hh24ss')>'16/06/30'
wykonuję już na tabeli NOWA gdzie nie ma wpisów 'None'

0

po pierwsze pogratulować trzymania daty w polu varchar - ale to pewnie nie Twój pomysł.

A jak już to nie prościej tak:

select * from tabela where data_wpływu <> 'None' and data_wpływu > '2016-06-30'

lub

select * from tabela where data_wpływu <> 'None' and data_wpływu >= '2016-07-01'

jeśli ma nie brać czasu pod uwagę

A co to Twojego błędu to zapewne '16/06/30' nie jest poprawnym formatem daty. Btw porównywanie daty z ciągiem znakowym jest dość niebezpieczne bo powoduje niejawną konwersję na którą nie masz wpływu i nie możesz być pewny (możesz sprawdzić ale nie jest powiedziane, że nie zostanie zmieniony) czy format jaki podałeś jest poprawny

0

Dyikuj za odpowiedz.

0

Jeśli używasz to_date(NOWA.data_wplywu,'YYYY-MM-DD hh24ss')>'16/06/30'
to pamiętaj że odwołanie to_date(pole_daty, 'format_daty') przykład:

Zapytanie: SELECT TO_DATE('2015-06-15 2103', 'YYYY-MM-DD HH24SS') FROM dual;
Wynik: 2015-06-15 2103

Jeśli używasz w formacie daty separatora '-' to pamietaj zeby datę którą porównujesz zapisać rowniez w takim formacie czyli 2016-06-30

Jeśli chcesz porównać datę z zaokrągleniem do dnia - bez czasu mozesz uzyc polecenia trunc:
Przyklad:
zapytanie: select sysdate from dual;
wynik: 2016-07-16 2114

zapytanie: select trunc(sysdate) from dual;
wynik: 2016-07-16

pozdrawiam

1 użytkowników online, w tym zalogowanych: 0, gości: 1