Oracle
 sql >> база данни >  >> RDS >> Oracle

Моят TO_DATE изглежда не функционира правилно

Най-вероятно проблемът е, че има компонент с частична дата, който не вземате предвид. Можете да пренебрегнете този компонент на дробна дата, като съкратите колоната в заявката си:

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;

Предполагам, че колоната enroll_date е от типа данни ДАТА.

Някои обяснения:Oracle съхранява дати, както е описано тук , той НЕ съхранява дата, тъй като заявявате „Форматът на датата, в който вече е DD-MON-YY.“. Това е само форматът, в който виждате датата, която се определя от параметъра NLS_DATE_FORMAT за вашата сесия.

Нека направим бърз тест с тестова таблица. Създайте таблица и проверете NLS_DATE_FORMAT от моята сесия.

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

Ето как ще виждам датите си.


SELECT * FROM date_tst;

04-OCT-2020

Така че имам днешната дата. Готино. Сега да видим дали мога да направя заявка, използвайки тази дата:


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

no rows.

Не се показват редове, защото форматът на датата, в който получавам датата си, няма компонент за време. ДАТА има година, месец, ден, час, минута и секунди. Форматът има само година, месец и ден. Нека направим запитване към данните, за да проверим дали има времеви компонент.

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

4-OCT-2020 21:12:39

А, ето го... SYSDATE е текущият час до секунда. Сега нека опитаме тази заявка отново с по-точен формат на датата:

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

04-OCT-2020

И там е нашият ред. Командата TRUNC ще отреже времевия компонент:

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

04-OCT-2020 00:00:00

Така че можете да опростите заявката си:

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

04-OCT-2020


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Кой тип данни .NET е най-подходящ за картографиране на типа данни NUMBER Oracle в NHibernate?

  2. Предотвратяване на отпадане на таблица в целева схема в Oracle Streams

  3. логика в клаузата HAVING за получаване на множество стойности на група по резултат

  4. Как да изберете свързана група елементи в Oracle SQL

  5. Запитване с помощта на оператор в колона VARCHAR2