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-95
is geen string, en 20-JUN-94
ook 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
DEC
niet noodzakelijk december. Het hangt af van uwNLS_DATE_LANGUAGE
enNLS_DATE_FORMAT
instellingen. Om er zeker van te zijn dat uw vergelijking met elke landinstelling werkt, kunt u het datetime-formaatmodel gebruikenMM
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 waarde gebruikt, moetuw datum specificeren in de notatie YYYY-MM-DD
en 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_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 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 SESSION
syntaxis. Bijvoorbeeld:
alter session set nls_date_format = 'DD.MM.YYYY HH24:MI:SS';
Dit betekent:
DD
numerieke dag van de maand, 1 – 31MM
numerieke maand van het jaar, 01 – 12 ( januari is 01 )YYYY
4-cijferig jaartal – naar mijn mening is dit altijdbeter dan een 2-cijferig jaartalYY
aangezien er geen verwarring is met welke eeuw waar je naar verwijst.HH24
uur van de dag, 0 – 23MI
minuut van het uur, 0 – 59SS
seconde van de minuut, 0-59
U kunt uw huidige taal- en datumtaalinstellingen achterhalen door V$NLS_PARAMETERSs
en het volledige scala aan geldige waarden te zoeken door V$NLS_VALID_VALUES
te 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_char
werkt 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';