sql >> Database teknologi >  >> RDS >> Oracle

Sammenligning af datoer i Oracle SQL

31-DEC-95 er ikke en streng, og det er 20-JUN-94 heller ikke . Det er numre med nogle ekstra ting tilføjet til sidst. Dette skal være '31-DEC-95' eller '20-JUN-94' - Bemærk det enkelte citat, ' . Dette vil gøre dig i stand til at lave en strengsammenligning.

Du laver dog ikke en strengsammenligning; du laver en datosammenligning . Du bør forvandle din streng til en dato. Enten ved at bruge den indbyggede TO_DATE() funktion eller en bogstavelig dato.

TO_DATE()

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

Denne metode har et par unødvendige faldgruber

  • Som a_horse_with_no_name bemærkede i kommentarerne, DEC , betyder ikke nødvendigvis december. Det afhænger af din NLS_DATE_LANGUAGE og NLS_DATE_FORMAT indstillinger. For at sikre, at din sammenligning med fungerer i enhver lokalitet, kan du bruge dato- og tidsformatmodellen MM i stedet
  • Året '95 er upræcis. Du ved, du mener 1995, men hvad nu hvis det var '50, er det 1950 eller 2050? Det er altid bedst at være eksplicit
select employee_id
  from employee
 where employee_date_hired > to_date('31-12-1995','DD-MM-YYYY')

Datobogstaver

En date literal er en del af ANSI-standarden, hvilket betyder, at du ikke behøver at bruge en Oracle-specifik funktion. Når du bruger en bogstavelig, skal angiv din dato i formatet YYYY-MM-DD og du kan ikke inkludere et tidselement.

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

Husk, at Oracle-datodatatypen inkluderer et tidselement, så datoen uden tidsdel svarer til 1995-12-31 00:00:00 .

Hvis du vil inkludere en tidsdel, skal du bruge et tidsstempel, 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'

Yderligere information

NLS_DATE_LANGUAGE er afledt af NLS_LANGUAGE og NLS_DATE_FORMAT er afledt af NLS_TERRITORY . Disse er indstillet, da du oprindeligt oprettede databasen, men de kan ændres ved at ændre din initialiseringsparameterfil - kun hvis det virkelig er nødvendigt - eller på sessionsniveauet ved at bruge ALTER SESSION syntaks. For eksempel:

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

Det betyder:

  • DD numerisk dag i måneden, 1 - 31
  • MM numerisk måned i året, 01 - 12 ( januar er 01 )
  • YYYY 4-cifret årstal - efter min mening er dette altid bedre end et 2-cifret årstal YY da der ikke er nogen forveksling med hvilket århundrede du henviser til.
  • HH24 time på dagen, 0 - 23
  • MI minut i timen, 0 - 59
  • SS sekund i minuttet, 0-59

Du kan finde ud af dine aktuelle sprog- og datosprogindstillinger ved at forespørge V$NLS_PARAMETERSs og hele spektret af gyldige værdier ved at forespørge V$NLS_VALID_VALUES .

Yderligere læsning

  • Formatér modeller

I øvrigt, hvis du vil have count(*) du skal gruppere efter employee_id

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

Dette giver dig optællingen pr. employee_id .



  1. Skrive optimeringer til Qualcomm Centriq 2400 i MariaDB 10.3.5 Release Candidate

  2. Oracle Konverter TIMESTAMP med Timezone til DATE

  3. Hvorfor skal du lære PostgreSQL?

  4. Hash joins på nullable kolonner