Основная проблема заключается в том, что дата включает часы, минуты и секунды, которые вы не учитываете. Если вы хотите, все для одного дня вы можете использовать функцию trunc
для того, чтобы получить это:
SELECT * FROM TEST_DATE WHERE trunc(EMP_DATE) = trunc(SYSDATE);
По умолчанию trunc
удаляет временную часть даты, при работе на колонке даты. Я бы рекомендовал функциональный индекс на trunc(emp_date)
, чтобы оптимизировать этот запрос. Что-то вроде:
create index i_test_date on test_date(trunc(emp_date));
Я построил немного SQL Fiddle, чтобы продемонстрировать это.
Возникла дополнительная проблема; хотя Oracle действительно поддерживает литералы даты ANSI, ваш второй запрос неверен. Всегда, явно преобразовать в строку с датой с помощью функции to_date
.
SELECT * FROM TEST_DATE WHERE EMP_DATE = to_date('01-07-2012','dd-mm-yyyy');
Я использовал mm
datetime format model вместо mon
, поскольку нет никакой гарантии, что JUL
всегда будет означать, июль; это зависит от ваших параметров NLS, от того, какой «язык дат» используется вашей конкретной базой данных или сеансом. Модель формата даты и времени - это то, как вы указываете базе данных формат любой строки, которую вы передаете, чтобы преобразовать ее в дату.
Если вы заинтересованы синтаксис ANSI для второго запроса будет:
SELECT * FROM TESt_DATE WHERE trunc(EMP_DATE) = DATE '2012-07-01'
Он должен быть в этом формате (YYYY-MM-DD) для работы.
Спасибо Бен за ваше предложение !! Поэтому, когда я вставляю дату, используя SYSDATE, она будет хранить соответственно дату и время. и получить то же самое мне нужно, чтобы сократить дату, чтобы получить результат? – Aspirant
@ Аспирант, если вы хотите добиться результата за этот день, да. Не забывайте, что 'sysdate' постоянно изменяется, поэтому, как только вы вставили запись и попытаетесь ее выбрать,' sysdate' будет «отмечен» на несколько секунд, а дата не будет _exactly_ одинаковой. Играйте и смотрите сами :-) – Ben