У меня есть sql примерно так:
SELECT EMP_NAME, DEPT
FROM EMPLOYEE
WHERE TIME_CREATED >= TO_DATE('26/JAN/2011','dd/mon/yyyy')
-> Это возвращает 10 строк и TIME_CREATED = '26 -JAN-2011 '
Теперь, когда я делаю это, я не получаю никаких строк назад,
SELECT EMP_NAME, DEPT
FROM EMPLOYEE
WHERE TIME_CREATED = TO_DATE('26/JAN/2011','dd/mon/yyyy')
-> Взял больше, чем из
По какой причине?
sql
oracle
time
date-arithmetic
Sanjeev40084
источник
источник
01
вместоJAN
(плюс, конечно, формат approriate), чтобы ваш код работал без проблем в любой системе.Ответы:
Да: TIME_CREATED содержит дату и время . Используйте,
TRUNC
чтобы убрать время:SELECT EMP_NAME, DEPT FROM EMPLOYEE WHERE TRUNC(TIME_CREATED) = TO_DATE('26/JAN/2011','dd/mon/yyyy')
ОБНОВЛЕНИЕ:
как указывает Дэйв Коста в комментарии ниже, это не позволит Oracle использовать индекс столбца,
TIME_CREATED
если он существует. Альтернативный подход без этой проблемы:SELECT EMP_NAME, DEPT FROM EMPLOYEE WHERE TIME_CREATED >= TO_DATE('26/JAN/2011','dd/mon/yyyy') AND TIME_CREATED < TO_DATE('26/JAN/2011','dd/mon/yyyy') + 1
источник
BETWEEN TO_DATE('26/JAN/2011','dd/mon/yyyy') AND TO_DATE('26/JAN/2011','dd/mon/yyyy') + 1
?between
из-за двусмысленности. Это звучит так, как будто это исключительные границы, хотя на самом деле это включает. Вот почему я избегаю этого. Более того, в этом конкретном примере все было бы иначе.Вы также можете использовать следующее, чтобы включить часть TIME в свой запрос:
SELECT EMP_NAME , DEPT FROM EMPLOYEE WHERE TIME_CREATED >= TO_DATE('26/JAN/2011 00:00:00', 'dd/mon/yyyy HH24:MI:SS');
источник
Вы также можете:
SELECT EMP_NAME, DEPT FROM EMPLOYEE WHERE TRUNC(TIME_CREATED) = DATE '2011-01-26'
источник
Это связано с тем, что
DATE
столбец в Oracle также содержит временную часть. Результатомto_date()
функции является дата с установленным временем,00:00:00
поэтому она, вероятно, не соответствует ни одной строке в таблице.Вам следует использовать:
SELECT EMP_NAME, DEPT FROM EMPLOYEE WHERE trunc(TIME_CREATED) = TO_DATE('26/JAN/2011','dd/mon/yyyy')
источник
Как другие люди прокомментировали выше, использование TRUNC предотвратит использование индексов (если был индекс на TIME_CREATED). Чтобы избежать этой проблемы, запрос можно структурировать как
SELECT EMP_NAME, DEPT FROM EMPLOYEE WHERE TIME_CREATED BETWEEN TO_DATE('26/JAN/2011','dd/mon/yyyy') AND TO_DATE('26/JAN/2011','dd/mon/yyyy') + INTERVAL '86399' second;
86399 на 1 секунду меньше количества секунд в сутках.
источник