Próbuję wyświetlić liczbę pracowników zatrudnionych po 20 czerwca 1994 r., Ale pojawia się błąd z informacją o nieprawidłowym identyfikatorze JUN. Proszę o pomoc, dzięki!
Select employee_id, count(*)
From Employee
Where to_char(employee_date_hired, 'DD-MON-YY') > 31-DEC-95;
> <
lubBETWEEN '' AND ''
Odpowiedzi:
31-DEC-95
nie jest ciągiem ani nim nie jest20-JUN-94
. To liczby z dodatkowymi rzeczami na końcu. Powinno to być'31-DEC-95'
albo'20-JUN-94'
- zwrócić uwagę na jeden cytat,'
. Umożliwi to wykonanie porównania ciągów.Jednak nie robisz porównania ciągów; porównujesz daty . Powinieneś przekształcić swój ciąg w datę. Albo używając funkcji wbudowanej
TO_DATE()
, albo literału daty .SPOTYKAĆ SIĘ Z KIMŚ()
Ta metoda ma kilka niepotrzebnych pułapek
DEC
, niekoniecznie oznacza grudzień. To zależy od twoichNLS_DATE_LANGUAGE
iNLS_DATE_FORMAT
ustawień. Aby mieć pewność, że porównanie będzie działać w dowolnej lokalizacji, można zamiast tego użyć modelu formatu daty i godzinyMM
Literały daty
Literał daty jest częścią standardu ANSI, co oznacza, że nie musisz używać funkcji specyficznej dla Oracle. Używając literału, musisz określić swoją datę w formacie
YYYY-MM-DD
i nie możesz dołączyć elementu czasu.Pamiętaj, że typ danych Oracle zawiera element czasu, więc data bez części czasu jest równoważna
1995-12-31 00:00:00
.Jeśli chcesz uwzględnić część czasu, musisz użyć literału datownika, który przyjmuje format
YYYY-MM-DD HH24:MI:SS[.FF0-9]
Dalsza informacja
NLS_DATE_LANGUAGE
pochodzi zNLS_LANGUAGE
iNLS_DATE_FORMAT
pochodzi zNLS_TERRITORY
. Są one ustawiane podczas początkowego tworzenia bazy danych, ale można je zmienić, zmieniając plik parametrów inicjalizacji - tylko jeśli jest to naprawdę wymagane - lub na poziomie sesji przy użyciuALTER SESSION
składni. Na przykład:To znaczy:
DD
numeryczny dzień miesiąca, 1-31MM
numeryczny miesiąc roku, 01-12 (styczeń to 01)YYYY
4-cyfrowy rok - moim zdaniem jest to zawsze lepsze niż rok 2-cyfrowy,YY
ponieważ nie ma wątpliwości, do jakiego wieku się odnosisz.HH24
godzina dnia, 0 - 23MI
minuta godziny, 0 - 59SS
sekunda minuty, 0-59Możesz sprawdzić swój bieżący język i ustawienia języka daty, wysyłając zapytanie,
V$NLS_PARAMETERSs
a pełną gamę prawidłowych wartości, wysyłając zapytanieV$NLS_VALID_VALUES
.Dalsza lektura
Nawiasem mówiąc, jeśli chcesz
count(*)
, musisz pogrupować wedługemployee_id
To daje liczbę na
employee_id
.źródło
DEC
niekoniecznie zawsze jest ważnym miesiącem. Zwykle lepiej jest używać liczb zamiast nazwtimestamp
dosłowne zamiastdate
dosłowny:timestamp '2015-01-30 19:42:04'
(bo w ANSI SQL Adate
typ danych nie ma czasu, tylkotimestamp
typ danych robi).DATE 2016-04-01
to2016-04-01 00:00:00
naprawdę środki . I myślę, że ta składnia działa od Oracle 9i, ponieważ jest to miejsce, w którym składnia ANSI-SQL została wprowadzona do Oracle.define
to polecenie SQL * Plus, które zastępuje wszystko, co zdefiniowałeś, we wszystkich zmiennych podstawiających o tej nazwie .ALTER SESSION
to instrukcja, która pozwala na modyfikację niektórych parametrów lub ustawień bazy danych na czas trwania tej sesjiWniosek,
to_char
działa na swój sposóbWięc,
Zawsze używaj tego formatu RRRR-MM-DD do porównania zamiast MM-DD-RR lub DD-MM-RRRR lub innego formatu
źródło
Możesz użyć trunc i to_date w następujący sposób:
źródło
z twojego zapytania:
myślę, że nie ma na celu wyświetlenia liczby pracowników zatrudnionych po 20 czerwca 1994 roku. Jeśli chcesz wyświetlić liczbę pracowników, możesz użyć:
Myślę, że najlepszą praktyką jest porównywanie dat:
źródło
Musi tam być pojedynczy cudzysłów, ponieważ data została przekonwertowana na znak.
źródło