sql >> Databáze >  >> RDS >> Oracle

Zdá se, že moje TO_DATE nefunguje správně

Nejpravděpodobnějším problémem je, že existuje část zlomkového data, kterou neberete v úvahu. Tuto komponentu zlomkového data můžete ignorovat zkrácením sloupce v dotazu:

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;

Předpokládám, že sloupec enroll_date je datového typu DATE.

Nějaké vysvětlení:Oracle ukládá data, jak je popsáno zde , NEULOŽÍ datum, jak uvádíte "Formát data, který je již ve formátu DD-MON-YY.". To je pouze formát, ve kterém vidíte datum, který je určen parametrem NLS_DATE_FORMAT pro vaši relaci.

Udělejme rychlý test s testovací tabulkou. Vytvořte tabulku a zkontrolujte NLS_DATE_FORMAT z mé relace.

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

Takto uvidím svá data.


SELECT * FROM date_tst;

04-OCT-2020

Tak mám dnešní datum. Chladný. Nyní se podíváme, zda mohu zadat dotaz pomocí tohoto data:


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

no rows.

Nejsou zobrazeny žádné řádky, protože formát data, ve kterém dostávám své datum, nemá časovou složku. DATE má rok, měsíc, den, hodinu, minutu a sekundy. Formát má pouze rok, měsíc a den. Umožňuje dotazovat se na data a zkontrolovat, zda existuje časová složka.

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

4-OCT-2020 21:12:39

Aha, je to... SYSDATE je aktuální čas až do sekundy. Nyní zkusme tento dotaz znovu s přesnějším formátem data:

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

04-OCT-2020

A tady je naše řada. Příkaz TRUNC odřízne časovou složku:

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

04-OCT-2020 00:00:00

Takže můžete svůj dotaz zjednodušit:

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

04-OCT-2020


  1. heroku run rake db:migrate error

  2. Rozdíly mezi MySql a MySqli v PHP

  3. Přidávání Postgresql do mé aplikace Heroku – problémy s dotazy na selhání syntaxe?

  4. Funkce SQL velmi pomalá ve srovnání s dotazem bez funkce wrapper