sql >> Database >  >> RDS >> Oracle

Datums vergelijken in Oracle SQL

31-DEC-95 is geen string, noch is 20-JUN-94 . Het zijn nummers met wat extra dingen aan het einde. Dit moet '31-DEC-95' . zijn of '20-JUN-94' - let op het enkele aanhalingsteken, ' . Hiermee kunt u een stringvergelijking maken.

U doet echter geen stringvergelijking; je doet een datumvergelijking . Je moet je string in een datum veranderen. Ofwel door gebruik te maken van de ingebouwde TO_DATE() functie, of een letterlijke datum.

TO_DATE()

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

Deze methode heeft een paar onnodige valkuilen

  • Zoals a_horse_with_no_name opmerkte in de opmerkingen, DEC , betekent niet noodzakelijk december. Het hangt af van uw NLS_DATE_LANGUAGE en NLS_DATE_FORMAT instellingen. Om er zeker van te zijn dat uw vergelijking met werk in elke taal werkt, kunt u het datetime-formaatmodel MM . gebruiken in plaats daarvan
  • Het jaar '95 is onnauwkeurig. Je weet dat je 1995 bedoelt, maar wat als het '50 was, is dat 1950 of 2050? Het is altijd het beste om expliciet te zijn
select employee_id
  from employee
 where employee_date_hired > to_date('31-12-1995','DD-MM-YYYY')

Letterlijke datums

Een letterlijke datum is onderdeel van de ANSI-standaard, wat betekent dat u geen Oracle-specifieke functie hoeft te gebruiken. Wanneer u een letterlijke gebruikt u moet specificeer uw datum in het formaat YYYY-MM-DD en u kunt geen tijdselement opnemen.

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

Onthoud dat het datatype Oracle-datum een ​​tijdelement bevat, dus de datum zonder tijdgedeelte is gelijk aan 1995-12-31 00:00:00 .

Als u een tijdsgedeelte wilt opnemen, moet u een letterlijke tijdstempel gebruiken, die de indeling YYYY-MM-DD HH24:MI:SS[.FF0-9] heeft.

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

Meer informatie

NLS_DATE_LANGUAGE is afgeleid van NLS_LANGUAGE en NLS_DATE_FORMAT is afgeleid van NLS_TERRITORY . Deze worden ingesteld toen u de database voor het eerst aanmaakte, maar ze kunnen worden gewijzigd door uw bestand met initialisatieparameters te wijzigen - alleen als dit echt nodig is - of op sessieniveau met behulp van de ALTER SESSION syntaxis. Bijvoorbeeld:

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

Dit betekent:

  • DD numerieke dag van de maand, 1 - 31
  • MM numerieke maand van het jaar, 01 - 12 ( januari is 01 )
  • YYYY 4-cijferig jaar - naar mijn mening is dit altijd beter dan een jaartal van 2 cijfers YY aangezien er geen verwarring bestaat over de eeuw waarnaar u verwijst.
  • HH24 uur van de dag, 0 - 23
  • MI minuut van het uur, 0 - 59
  • SS seconde van de minuut, 0-59

U kunt uw huidige taal- en datumtaalinstellingen achterhalen door V$NLS_PARAMETERSs op te vragen. en het volledige scala aan geldige waarden door V$NLS_VALID_VALUES op te vragen .

Verder lezen

  • Modellen opmaken

Overigens, als u de count(*) je moet groeperen op employee_id

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

Dit geeft je het aantal per employee_id .



  1. Problemen oplossen bij het werken met datum en tijd in SQL Server

  2. cursor.execute(INSERT INTO im_entry.test (+entrym+) WAARDEN ('+p+');)

  3. Omvang van SQL Server-database met behulp van back-upgeschiedenis

  4. Hoe te werken met overerving in Entity Framework Core