Здравствуй, уважаемый читатель! На прошлом уроке мы начали писать простые запросы и столкнулись с проблемой неявного преобразования текста в дату. Чем это опасно и как использовать даты в запросе правильно, я расскажу сегодня.
Итак, мы поняли, что при написании дат в SQL–запросах в виде текста (то есть дат в кавычках), перед выполнением SQL–запросов, даты из текста будут автоматически распознаны. Текст будет неявно преобразован в дату. Неявно, означает, что без явной нашей команды на преобразование. ORACLE, на основании своего понимания как должна выглядеть дата, делает ее извлечение из текста.
Например, в SQL запросе указана дата вида: '01.03.1980'. На одном компьютере, ORACLE может «понять», что первые две цифры – это номер дня, затем, после точки, идёт номер месяца и в конце указан четырёх символьный номер года. На другом компьютере СУБД распознает дату с предшествующим месяцем, затем с днём. То есть, наоборот.
В первом случае, будут отобраны данные за первое марта, во втором случае – за третье января. Такое использование дат в SQL запросах крайне опасно. Особенно в описанном выше случае – ORACLE «смог» из текста распознать дату, но мы не узнали, что он распознал ее неправильно. СУБД не выдала ошибку. На основе полученных данных мог строиться анализ и приниматься важное решение.
Если бы в запрос передавалась дата '21.01.1980', а Оракл ожидал бы в начале месяц, а потом число, то при выполнении запроса, мы бы получили ошибку о некорректном номере месяца. Получение явной ошибки от Оракла – это лучше, чем ее скрытое наличие. Теперь самое время научиться вписывать даты в запрос правильно.
Для того, чтобы правильно вписать дату в SQL–запрос, необходимо ее явно преобразовать из текста в дату с указанием того, как она должна быть преобразована. Что из написанного день, а что – месяц. Для этого воспользуемся функцией Oracle – to_date.
Функции to_date вначале нужно указать такой текст должен быть преобразован в дату, а затем нужно указать маску (формат) преобразования.
Пример использования функции to_date:
Приведённый выше запрос выбирает из таблицы Persons сотрудников, родившихся в 80–е.
Напишем запрос, выводящий все заказы в платной столовой (расположенной на пятом этаже в нашей компании), сделанные 10 марта 2019:
Получаем результат (на скриншоте ниже показаны не все отобранные данные – в целях экономии места):
В колонке PersonID идентификатор сотрудника, сделавшего заказ. В колонке DateOrder дата заказа, и в колонке DishID – идентификатор заказанного блюда.
На следующем уроке продолжим разбирать функции преобразования.
Буду рад, если подпишешься на мой канал или оставишь комментарий к моему посту! Скоро будет продолжение!
Заходи на наш Youtube-канал и найдёшь много интересного и полезного про базы данных и язык SQL.
А здесь ты можешь пройти наш курс обучения языку SQL и получить мощные знания и умения! Всего за 27 уроков до уровня специалиста, имеющего трёхлетний стаж. Много практики в реальной базе данных! С нашей поддержкой и проверкой твоих самостоятельный задач! Записывайся, буду тебя ждать!