sql >> Databasteknik >  >> RDS >> Oracle

Jämföra datum i Oracle SQL

31-DEC-95 är inte en sträng och inte heller 20-JUN-94 . Det är siffror med lite extra saker på slutet. Detta bör vara '31-DEC-95' eller '20-JUN-94' - notera det enda citatet, ' . Detta gör att du kan göra en strängjämförelse.

Men du gör inte en strängjämförelse; du gör en datumjämförelse . Du bör förvandla din sträng till ett datum. Antingen genom att använda den inbyggda TO_DATE() funktion, eller ett bokstavligt datum.

TO_DATE()

select employee_id
  from employee
 where employee_date_hired > to_date('31-DEC-95','DD-MON-YY')

Denna metod har några onödiga fallgropar

  • Som a_horse_with_no_name noterade i kommentarerna, DEC , betyder inte nödvändigtvis december. Det beror på din NLS_DATE_LANGUAGE och NLS_DATE_FORMAT inställningar. För att säkerställa att din jämförelse med fungerar i alla språk kan du använda formatmodellen för datum och tid MM istället
  • Året 95 är inexakt. Du vet att du menar 1995, men tänk om det var 50, är ​​det 1950 eller 2050? Det är alltid bäst att vara tydlig
select employee_id
  from employee
 where employee_date_hired > to_date('31-12-1995','DD-MM-YYYY')

Datumbokstav

En bokstavlig datum är en del av ANSI-standarden, vilket innebär att du inte behöver använda en Oracle-specifik funktion. När du använder en bokstavlig måste ange ditt datum i formatet YYYY-MM-DD och du kan inte inkludera ett tidselement.

select employee_id
  from employee
 where employee_date_hired > date '1995-12-31'

Kom ihåg att Oracles datumdatatyp inkluderar ett tidselement, så datumet utan tidsdel motsvarar 1995-12-31 00:00:00 .

Om du vill inkludera en tidsdel måste du använda en tidsstämpel bokstavlig, som har formatet YYYY-MM-DD HH24:MI:SS[.FF0-9]

select employee_id
  from employee
 where employee_date_hired > timestamp '1995-12-31 12:31:02'

Ytterligare information

NLS_DATE_LANGUAGE härleds från NLS_LANGUAGE och NLS_DATE_FORMAT härleds från NLS_TERRITORY . Dessa ställs in när du först skapade databasen men de kan ändras genom att ändra din initialiseringsparametrarfil - endast om det verkligen krävs - eller på sessionsnivå genom att använda ALTER SESSION syntax. Till exempel:

alter session set nls_date_format = 'DD.MM.YYYY HH24:MI:SS';

Det betyder:

  • DD numerisk dag i månaden, 1 - 31
  • MM numerisk månad på året, 01–12 (januari är 01)
  • YYYY 4-siffrigt år - enligt min mening är detta alltid bättre än ett tvåsiffrigt årtal YY eftersom det inte finns någon förväxling med vilket århundrade du syftar på.
  • HH24 timme på dygnet, 0 - 23
  • MI minut i timmen, 0 - 59
  • SS sekund i minuten, 0-59

Du kan ta reda på dina aktuella språk- och datumspråkinställningar genom att fråga V$NLS_PARAMETERSs och hela omfånget av giltiga värden genom att fråga V$NLS_VALID_VALUES .

Mer läsning

  • Formatera modeller

För övrigt, om du vill ha count(*) du måste gruppera efter employee_id

select employee_id, count(*)
  from employee
 where employee_date_hired > date '1995-12-31'
 group by employee_id

Detta ger dig antalet per employee_id .



  1. SQL Server Index bakåtsökning:Förståelse, justering

  2. SQLiteDiskIOException:felkod 10:disk I/O-fel återställs på ICS och Samsung Nexus på DROP TABLE

  3. Android Room Embedded Relation ignorerar SQL where-villkor

  4. Hur läser man innehållet i en .sql-fil till ett R-skript för att köra en fråga?