Разница между функцией trunc () и AND в столбце datetime - PullRequest
0 голосов
/ 09 ноября 2018

Является ли этот запрос

select 1 from tab1 where
TRUNC(tab1.T_DATE) = TRUNC(to_date('2018-08-31','yyyy-mm-dd'))

Похоже на это?

select 1 from tab1 where    
        tab1.T_DATE >= to_date('2018-08-31','yyyy-mm-dd')
        And tab1.T_DATE < to_date('2018-09-01','yyyy-mm-dd')

Тогда когда мне нужно использовать функцию Trunc ()? Я спрашиваю разницу, потому что у меня есть запрос, использующий Trunc (), и запрос нуждается в индексе (конечно, я не хочу использовать FBI), поэтому я заменяю функцию на AND. Однако я беспокоюсь, что может быть какая-то разница.

Пример данных:

31/08/2018
31/08/2018
31/08/2018
31/08/2018
31/08/2018
31/08/2018
31/08/2018
31/08/2018
31/08/2018
31/08/2018
31/08/2018
31/08/2018 10:19:02 PM
31/08/2018 07:55:01 PM
31/08/2018 1:08:54 PM
31/08/2018 1:18:44 PM
31/08/2018 1:45:34 PM
31/08/2018 1:53:57 PM
31/08/2018 1:59:01 PM
31/08/2018 2:04:19 PM
31/08/2018 4:06:56 PM

Ответы [ 2 ]

0 голосов
/ 09 ноября 2018

Да, два запроса делают одно и то же.

Oracle не имеет реального типа данных DATE. Его DATE на самом деле DATETIME, который снова и снова вводил людей в заблуждение :-) Вы можете получить доступ к столбцу реальных данных, используя проверочное ограничение, которое отклоняет даты с частью времени или с помощью триггера, который удаляет эту часть.

Что касается вашей таблицы, у которой действительно есть datetime и два запроса, выбирающих строки дня:

Первый запрос более читабелен. Люди часто возражают против того, что для второго запроса могут быть полезны индексы в столбце T_DATE. Однако, поскольку Oracle имеет функциональные индексы, вы должны использовать индекс для TRUNC(t_date), а аргумент void.

0 голосов
/ 09 ноября 2018

Вы спрашиваете, эквивалентны ли они:

where TRUNC(tab1.T_DATE) = TRUNC(to_date('2018-08-31','yyyy-mm-dd'))

where tab1.T_DATE >= to_date('2018-08-31','yyyy-mm-dd') and
      tab1.T_DATE < to_date('2018-09-01','yyyy-mm-dd')

Да. Они оба возвращают все значения T_DATE на 2018-08-31, независимо от даты. TRUNC() применительно к дате удаляет компонент времени. Следовательно, оно не нужно в правой части первого выражения.

Я бы написал так:

where tab1.T_DATE >= date '2018-08-31' and
      tab1.T_DATE < date '2018-09-01'

, потому что это может использовать индекс для tab1(T_DATE).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...