Co możesz zrobić, jeśli masz różne formaty dat w źródle?
Mam przypadek, w którym używamy to_date
funkcja, aby uzyskać informacje z tabeli, ale pojawia się błąd, ponieważ niektóre rekordy mają format daty YYYY-DD-MM
zamiast YYYY-MM-DD
Jak zastosować do tego jednolite rozwiązanie?
Odpowiedzi:
1 dla odpowiedzi № 1Aby poradzić sobie z tą sytuacją (dowolny tekst powinien zostać przekształcony w strukturalną wartość daty), prawdopodobnie pracowałbym z wyrażeniami regularnymi.
W ten sposób możesz wybrać zestaw rekordów pasujących do formatu, który chcesz obsługiwać, i przeprowadzić konwersję typu na tych rekordach.
Na przykład:
create column table date_vals (dateval nvarchar (4000), date_val date)
insert into date_vals values ("2018-01-23", NULL);
insert into date_vals values ("12/23/2016", NULL);
select dateval, to_date(dateval, "YYYY-MM-DD") as SQL_DATE
from date_vals
where
dateval like_regexpr "[[:digit:]]{4}-[[:digit:]]{2}-[[:digit:]]{2}"
union all
select dateval, to_date(dateval, "MM/DD/YYYY") as SQL_DATE
from date_vals
where
dateval like_regexpr "[[:digit:]]{2}/[[:digit:]]{2}/[[:digit:]]{4}";
Podejście to zapewnia również dobrą opcję przeglądu niepasujących rekordów i możliwe wymyślenie dodatkowego wymaganego wzorca.
0 dla odpowiedzi nr 2
Dlaczego nie użyć przypadku, gdy wybierzesz miejsce, w którym chcesz przetestować różne wyrażenia regularne, a następnie użyj to_date, aby zwrócić datę w odpowiednim formacie.
Pozwoli to uniknąć zjednoczenia wszystkich i 2 instrukcji select.
Możesz dodać więcej „formatu” bez więcej „wyboru” w dodatkowej unii.
Chyba że like_regexpr działa tylko w klauzuli where (muszę przyznać, że nigdy nie próbowałem tej funkcji).