31-DEC-95bir dize değil 20-JUN-94. Sonuna bazı ekstra şeyler eklenmiş sayılar. Bu tek alıntı olmalı '31-DEC-95'ya da '20-JUN-94'- tek bir alıntıya dikkat etmeli '. Bu, bir dize karşılaştırması yapmanızı sağlayacaktır.
Ancak, dize karşılaştırması yapmıyorsunuz; tarih karşılaştırması yapıyorsunuz . Dizenizi bir tarihe dönüştürmelisiniz. Yerleşik TO_DATE()işlevi veya bir tarih değişmezini kullanarak .
BUGÜNE KADAR()
select employee_id
from employee
where employee_date_hired > to_date('31-DEC-95','DD-MON-YY')
Bu yöntemin birkaç gereksiz tuzağı var
- Yorumlarda belirtildiği gibi a_horse_with_no_name
DEC, Aralık anlamına gelmez. Bu sizin NLS_DATE_LANGUAGEve NLS_DATE_FORMATayarlarınıza bağlıdır . Herhangi bir yerel ayardaki çalışma ile karşılaştırmanızın yerine tarih / saat biçimini kullanabilirsiniz.MM
- '95 yılı kesin değil. 1995 demek istediğinizi biliyorsunuz, ama '50 ise, 1950 veya 2050 mi? Açık olmak her zaman en iyisidir
select employee_id
from employee
where employee_date_hired > to_date('31-12-1995','DD-MM-YYYY')
Tarih değişmez değerleri
Tarih değişmezi ANSI standardının bir parçasıdır, bu da Oracle'a özgü bir işlevi kullanmanız gerekmediği anlamına gelir. Değişmez değer kullanırken , tarih biçiminde belirtmeniz gerekirYYYY-MM-DD ve bir zaman öğesi ekleyemezsiniz.
select employee_id
from employee
where employee_date_hired > date '1995-12-31'
Oracle tarih veri türünün bir saat öğesi içerdiğini, bu nedenle saat bölümü olmayan tarihin eşdeğer olduğunu unutmayın 1995-12-31 00:00:00.
Bir zaman bölümü eklemek istiyorsanız, biçimi alan bir zaman damgası hazır bilgisi kullanmanız gerekir. YYYY-MM-DD HH24:MI:SS[.FF0-9]
select employee_id
from employee
where employee_date_hired > timestamp '1995-12-31 12:31:02'
Daha fazla bilgi
NLS_DATE_LANGUAGE, türetilmiştir NLS_LANGUAGEve NLS_DATE_FORMATtüretilmiştir NLS_TERRITORY. Bunlar, veritabanını ilk oluşturduğunuzda ayarlanır, ancak yalnızca gerçekten gerekliyse - inialization parametreleri dosyanızı değiştirerek veya ALTER SESSIONsözdizimini kullanarak oturum düzeyinde değiştirilebilir . Örneğin:
alter session set nls_date_format = 'DD.MM.YYYY HH24:MI:SS';
Bu şu anlama gelir:
DD ayın sayısal günü, 1 - 31
MM yılın sayısal ayı, 01-12 (Ocak 01'dir)
YYYY4 basamaklı yıl - bence bu, her zaman 2 basamaklı bir yıldan daha iyidir YY, çünkü hangi yüzyıldan bahsettiğinizle ilgili bir karışıklık yoktur.
HH24 Günün saati, 0 - 23
MI saatin dakikası, 0 - 59
SS dakikanın ikincisi, 0-59
Geçerli dil ve tarih dili ayarlarınızı sorgulayarak V$NLS_PARAMETERSsve geçerli değerlerin tamamını sorgulayarak bulabilirsiniz V$NLS_VALID_VALUES.
daha fazla okuma
Bu arada, isterseniz count(*)gruplandırmanız gerekiremployee_id
select employee_id, count(*)
from employee
where employee_date_hired > date '1995-12-31'
group by employee_id
Bu size başına sayıyı verir employee_id.
> <yaBETWEEN '' AND ''