ПРИХОДИТЕ УЧИТЬСЯ НОВОЙ ПРОФЕССИИ ЛЕТОМ СО СКИДКОЙ ДО 70%Забронировать скидку

Выборка из таблицы Oracle по дате без учета времени

Пройдите тест, узнайте какой профессии подходите и получите бесплатную карьерную консультацию
В конце подарим скидку до 55% на обучение
Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Чтобы произвести отбор записей по дате, игнорируя время, в Oracle можно воспользоваться функцией TRUNC, которую следует применить к столбцу, содержащему дату и время:

SQL
Скопировать код
SELECT * FROM ваша_таблица WHERE TRUNC(столбец_с_датой) = DATE 'ГГГГ-ММ-ДД';

Основные нюансы:

  • TRUNC(столбец_с_датой): конвертирует дату и время в формат, содержащий только дату.
  • DATE 'ГГГГ-ММ-ДД': задаёт дату, которую нужно отыскать.
  • Индекс на столбец_с_датой: улучшает производительность поиска.

Постарайтесь улучшить результат запросов, используя индексы и диапазоны дат!

Пройдите тест и узнайте подходит ли вам сфера IT
Пройти тест

Повышаем производительность: Индексы

Создание функционального индекса на TRUNC(столбец_с_датой) значительно увеличит скорость работы запросов для больших таблиц:

SQL
Скопировать код
CREATE INDEX idx_trunc_date_column ON ваша_таблица (TRUNC(столбец_с_датой));

Функциональные индексы — это скорее не топор, а острый кулинарный нож в мире SQL: они позволяют действовать точно и быстро!

С помощью такого индекса вы с легкостью будете находить записи по указанной дате даже в самых массивных наборах данных.

Работаем с диапазонами дат

Для выборки данных за определённый период в течение дня или за целый день используйте оператор BETWEEN в сочетании с функцией TO_DATE:

SQL
Скопировать код
SELECT * FROM ваша_таблица 
WHERE столбец_с_датой BETWEEN TO_DATE('ГГГГ-ММ-ДД', 'ГГГГ-ММ-ДД') AND TO_DATE('ГГГГ-ММ-ДД', 'ГГГГ-ММ-ДД') + 1 – INTERVAL '1' SECOND;

Таким образом, вы захватите каждую секунду выбранного дня до последнего мгновения перед наступлением полуночи.

Однообразие в подаче дат: Единый формат

Для правильного сравнения дат рекомендуется применить функцию TO_DATE с точно установленным форматом:

SQL
Скопировать код
TO_DATE('ГГГГ-ММ-ДД ЧЧ:ММ:СС', 'ГГГГ-ММ-ДД ЧЧ:ММ:СС')

Следование строгому формату исключает возможность недоразумений при сравнении дат.

Секретный ингредиент: Параметризованные даты

Чтобы добавить гибкости и повысить безопасность ваших запросов, используйте параметризованные даты, что поможет предотвратить SQL-инъекции:

SQL
Скопировать код
SELECT * FROM ваша_таблица WHERE TRUNC(столбец_с_датой) = TO_DATE(:somedate, 'ГГГГ-ММ-ДД');

Параметризация делает запросы более универсальными и безопасными.

Визуализация

Представьте себе ящик, заполненный часами, которые показывают различные даты и времена. Вам нужны только те, что соответствуют определённой дате:

Markdown
Скопировать код
Ящик: [⏰ 18-03 14:22, ⌚️ 18-03 09:47, 🕰️ 01-04 16:08]

В делаемом нами запросе мы ищем часы, показывающие нас интересующую дату, без учёта времени:

SQL
Скопировать код
SELECT * FROM часы WHERE TRUNC(время_и_дата) = TO_DATE('18-03', 'ММ-ДД');

Волшебство функции TRUNC() убирает время, оставляя только те даты, которые нужны нам:

Markdown
Скопировать код
До: [⏰ 18-03 14:22, ⌚️ 18-03 09:47, 🕰️ 01-04 16:08]
После:  [⏰ 18-03, ⌚️ 18-03]

Оператор равенства? Будьте бдительны!

Оператор (=) прекрасен для идентичного сравнения дат, однако может пропустить нужные вам записи из-за разницы во времени:

SQL
Скопировать код
-- Записи за 'ГГГГ-ММ-ДД' могут быть пропущены, если время отличается
SELECT * FROM ваша_таблица WHERE столбец_с_датой = TO_DATE('ГГГГ-ММ-ДД', 'ГГГГ-ММ-ДД');

Чтобы избежать таких ситуаций, всегда используйте TRUNC.

Нежданный гость: Неявные преобразования

Неявное преобразование дат может вызвать неожиданные проблемы, в случае использования строки вместо формата даты:

SQL
Скопировать код
-- Это рискованно, если формат NLS_DATE_FORMAT не совпадает с 'ГГГГ-ММ-ДД'
SELECT * FROM ваша_таблица WHERE TRUNC(столбец_с_датой) = 'ГГГГ-ММ-ДД';

Для того чтобы всё прошло без осложнений, строки должны быть правильно преобразованы в даты с точно заданной маской формата.

Полезные материалы

  1. Работа с датой и временем в Oracle — подробный анализ типов данных для даты и времени.
  2. Предикат BETWEEN в Oracle / PLSQL — всё о применении диапазонов дат в Oracle.
  3. Вопросы – Ask TOM — ценные советы напрямую от экспертов Oracle.
  4. Обращение с датами в Oracle SQL Developer — обучающее видео, демонстрирующее, как работать с датами.
  5. Создание даты без времени в Oracle SQL — статья о способах улучшения эффективности запросов к столбцам, содержащим даты.