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

Сравняване на дати в Oracle SQL

31-DEC-95 не е низ, нито 20-JUN-94 . Те са числа с добавени някои допълнителни неща в края. Това трябва да бъде '31-DEC-95' или '20-JUN-94' - обърнете внимание на единичните кавички, ' . Това ще ви позволи да направите сравнение на низове.

Въпреки това, вие не правите сравнение на низове; правите сравнение на дати . Трябва да трансформирате низа си в дата. Или с помощта на вградения TO_DATE() функция или литерал за дата.

ДО_ДАТА()

select employee_id
  from employee
 where employee_date_hired > to_date('31-DEC-95','DD-MON-YY')

Този метод има няколко ненужни клопки

  • Както a_horse_with_no_name е отбелязано в коментарите, DEC , не означава непременно декември. Зависи от вашия NLS_DATE_LANGUAGE и NLS_DATE_FORMAT настройки. За да сте сигурни, че сравнението ви с работи във всеки локал, можете да използвате модела за формат за дата и час MM вместо това
  • Годината '95 е неточна. Знаеш, че имаш предвид 1995 г., но какво ще стане, ако беше '50, 1950 или 2050? Винаги е най-добре да бъдете изрични
select employee_id
  from employee
 where employee_date_hired > to_date('31-12-1995','DD-MM-YYYY')

Литерали за дата

Литералът за дата е част от стандарта ANSI, което означава, че не е нужно да използвате специфична функция на Oracle. Когато използвате литерал, трябва посочете датата си във формат YYYY-MM-DD и не можете да включите времеви елемент.

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

Не забравяйте, че типът данни за дата на Oracle включва елемент от време, така че датата без времева част е еквивалентна на 1995-12-31 00:00:00 .

Ако искате да включите времева част, тогава ще трябва да използвате литерал за времеви отпечатък, който приема формата YYYY-MM-DD HH24:MI:SS[.FF0-9]

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

Допълнителна информация

NLS_DATE_LANGUAGE е извлечен от NLS_LANGUAGE и NLS_DATE_FORMAT е извлечен от NLS_TERRITORY . Те се задават, когато първоначално сте създали базата данни, но могат да бъдат променени чрез промяна на вашия файл с параметри за инициализация - само ако наистина е необходимо - или на ниво сесия с помощта на ALTER SESSION синтаксис. Например:

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

Това означава:

  • DD числов ден от месеца, 1 - 31
  • MM числов месец в годината, 01 - 12 ( януари е 01 )
  • YYYY 4-цифрена година - според мен това е винаги по-добре от двуцифрена година YY тъй като няма объркване за кой век имате предвид.
  • HH24 час от деня, 0 - 23
  • MI минута от часа, 0 - 59
  • SS секунда от минутата, 0-59

Можете да разберете текущите си настройки за език и дата, като направите заявка за V$NLS_PARAMETERSs и пълната гама от валидни стойности чрез заявка за V$NLS_VALID_VALUES .

Допълнително четене

  • Форматирайте модели

Между другото, ако искате count(*) трябва да групирате по employee_id

select employee_id, count(*)
  from employee
 where employee_date_hired > date '1995-12-31'
 group by employee_id

Това ви дава броя на employee_id .



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Намиране на последния индекс на низ в Oracle

  2. cx Oracle ImportError

  3. ORA-22905 - при запитване на тип таблица с оператор select

  4. Ефективно четене и импортиране на CSV файлове в Oracle PL/SQL

  5. Конкатениране на резултати от SQL заявка в Oracle