Datums vergelijken in Oracle SQL

Ik probeer het aantal werknemers weer te geven dat is aangenomen na 20 juni 1994,

Select employee_id, count(*)
From Employee
Where to_char(employee_date_hired, 'DD-MON-YY') > 31-DEC-95; 

Maar ik krijg de foutmelding

“JUN’ ongeldige ID.

Help alstublieft, bedankt!


Antwoord 1, autoriteit 100%

31-DEC-95is geen string, en 20-JUN-94ook niet. Het zijn nummers met wat extra dingen aan het einde. Dit moet '31-DEC-95'of '20-JUN-94'zijn – 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, betekent DECniet noodzakelijk december. Het hangt af van uw NLS_DATE_LANGUAGEen NLS_DATE_FORMATinstellingen. Om er zeker van te zijn dat uw vergelijking met elke landinstelling werkt, kunt u het datetime-formaatmodel gebruiken MMin 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 waarde gebruikt, moetuw datum specificeren in de notatie YYYY-MM-DDen u kunt geen tijdselement opnemen.

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

Houd er rekening mee 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]

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

Meer informatie

NLS_DATE_LANGUAGEis afgeleid van NLS_LANGUAGEen NLS_DATE_FORMATis afgeleid van NLS_TERRITORY. Deze worden ingesteld toen u de database voor het eerst maakte, 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 SESSIONsyntaxis. Bijvoorbeeld:

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

Dit betekent:

  • DDnumerieke dag van de maand, 1 – 31
  • MMnumerieke maand van het jaar, 01 – 12 ( januari is 01 )
  • YYYY4-cijferig jaartal – naar mijn mening is dit altijdbeter dan een 2-cijferig jaartal YYaangezien er geen verwarring is met welke eeuw waar je naar verwijst.
  • HH24uur van de dag, 0 – 23
  • MIminuut van het uur, 0 – 59
  • SSseconde van de minuut, 0-59

U kunt uw huidige taal- en datumtaalinstellingen achterhalen door V$NLS_PARAMETERSsen het volledige scala aan geldige waarden te zoeken door V$NLS_VALID_VALUESte zoeken.

Verder lezen


Overigens, als je de count(*)wilt hebben, moet je 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 peremployee_id.


Antwoord 2, autoriteit 2%

Conclusie,

to_charwerkt op zijn eigen manier

Dus,

Gebruik altijd dit formaat JJJJ-MM-DDter vergelijking
in plaats van MM-DD-YYof DD-MM-YYYYof een ander formaat


Antwoord 3

Je kunt trunc en to_date als volgt gebruiken:

select TO_CHAR (g.FECHA, 'DD-MM-YYYY HH24:MI:SS') fecha_salida, g.NUMERO_GUIA, g.BOD_ORIGEN, g.TIPO_GUIA, dg.DOC_NUMERO, dg.* 
from ils_det_guia dg, ils_guia g
where dg.NUMERO_GUIA = g.NUMERO_GUIA and dg.TIPO_GUIA = g.TIPO_GUIA and dg.BOD_ORIGEN = g.BOD_ORIGEN
and dg.LAB_CODIGO = 56 
and trunc(g.FECHA) > to_date('01/02/15','DD/MM/YY')
order by g.FECHA;

Antwoord 4

van uw zoekopdracht:

Select employee_id, count(*) From Employee 
Where to_char(employee_date_hired, 'DD-MON-YY') > '31-DEC-95' 

ik denk dat het niet is om het aantal werknemers weer te geven dat is aangenomen na 20 juni 1994. als u het aantal werknemers wilt weergeven, kunt u het volgende gebruiken:

Select count(*) From Employee 
Where to_char(employee_date_hired, 'YYYMMMDDD') > 19940620 

Ik denk dat voor de beste werkwijze om datums te vergelijken die u kunt gebruiken:

employee_date_hired > TO_DATE('20-06-1994', 'DD-MM-YYYY');
or
to_char(employee_date_hired, 'YYYMMMDDD') > 19940620;

Antwoord 5

Enkel aanhalingsteken moet aanwezig zijn, sinds datum omgezet in teken.

Selecteer employee_id, count(*)
Van werknemer
Where to_char(werknemer_datum_ingehuurd, 'DD-MON-YY') > '31-DEC-95';

Other episodes