sql >> Database >  >> RDS >> Oracle

Mijn TO_DATE lijkt niet goed te werken

Hoogstwaarschijnlijk is het probleem dat er een fractionele datumcomponent is waarmee u geen rekening houdt. U kunt die fractionele datumcomponent negeren door de kolom in uw zoekopdracht af te kappen:

SELECT section_id, COUNT(student_id) "ENROLLED"
FROM enrollment
WHERE TRUNC(enroll_date) = TO_DATE('2/10/2007', 'MM/DD/YYYY')
GROUP BY section_id
ORDER BY ENROLLED;

Ik ga ervan uit dat de kolom enroll_date is van het gegevenstype DATE.

Enige uitleg:Oracle slaat datums op zoals beschreven hier , het slaat GEEN datum op zoals u aangeeft "Het datumformaat is al DD-MON-YY.". Dat is alleen het formaat waarin u de datum ziet, die wordt bepaald door de parameter NLS_DATE_FORMAT voor uw sessie.

Laten we een snelle test doen met een testtafel. Maak een tabel en controleer de NLS_DATE_FORMAT van mijn sessie.

create table DATE_TST 
( id NUMBER GENERATED BY DEFAULT ON NULL AS IDENTITY,
  test_date DATE
);

INSERT INTO date_tst (test_date) VALUES (SYSDATE);

SELECT value
FROM   nls_session_parameters
WHERE  parameter = 'NLS_DATE_FORMAT';

DD-MON-YYYY

Dit is hoe ik mijn dates zal zien.


SELECT * FROM date_tst;

04-OCT-2020

Dus ik heb de datum van vandaag. Koel. Laten we nu kijken of ik die datum kan gebruiken:


SELECT * FROM date_tst WHERE test_date = TO_DATE('04-OCT-2020','DD-MON-YYYY');

no rows.

Er worden geen rijen weergegeven omdat het datumformaat waarin ik mijn datum krijg geen tijdcomponent heeft. DATE heeft jaar, maand, dag, uur, minuut en seconden. Het formaat heeft alleen jaar, maand en dag. Laten we de gegevens opvragen om te controleren of er een tijdcomponent is.

SELECT TO_CHAR(test_date,'DD-MON-YYYY HH24:MI:SS') FROM date_tst;

4-OCT-2020 21:12:39

Ah daar is het... SYSDATE is de huidige tijd tot op de seconde. Laten we die zoekopdracht nu opnieuw proberen met een preciezere datumnotatie:

SELECT * FROM date_tst WHERE test_date = TO_DATE('04-OCT-2020 21:12:39','DD-MON-YYYY HH24:MI:SS');

04-OCT-2020

En daar is onze rij. Het TRUNC-commando zal de tijdcomponent afsnijden:

SELECT TO_CHAR(TRUNC(test_date),'DD-MON-YYYY HH24:MI:SS') FROM date_tst;

04-OCT-2020 00:00:00

U kunt uw zoekopdracht dus vereenvoudigen:

SELECT * FROM date_tst WHERE TRUNC(test_date) = TO_DATE('04-OCT-2020','DD-MON-YYYY');

04-OCT-2020


  1. Top MySQL Workbench-alternatieven

  2. Zoek afhankelijke objecten voor een tabel of weergave

  3. Exporteer eenvoudige Excel-gegevens naar MySQL met behulp van PHP

  4. Hoe kan ik een subquery dwingen om even goed te presteren als een #temp-tabel?