Как сделать выборку по дате в sql
Перейти к содержимому

Как сделать выборку по дате в sql

SQL запрос на выборку диапазона даты и времени

вид таблицы

Не могу сделать выборку по дате и времени. Делаю так:

Но выдаются значения только за последнюю дату.

Подскажите как правильней будет сделать запрос

user avatar

Вам нужно выбирать по сумме даты и времени

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

Если же индекса по полю DateReaders нет, то и условие не нужно. В любом случае будет полный перебор записей

А вообще разделение полей даты и времени в 90% плохая архитектура. Если вам не нужны выборки за определенное время для каждого дня, то эти поля нужно объединить в одно поле типа TIMESTAMP

Всё ещё ищете ответ? Посмотрите другие вопросы с метками mysql sql или задайте свой вопрос.

Site design / logo © 2022 Stack Exchange Inc; user contributions licensed under cc by-sa. rev 2022.6.13.42356

Нажимая «Принять все файлы cookie», вы соглашаетесь, что Stack Exchange может хранить файлы cookie на вашем устройстве и раскрывать информацию в соответствии с нашей Политикой в отношении файлов cookie.

Собеседования в сфере Data Science и распространённые приёмы работы с датами в SQL

Поговорим о распространённых приёмах работы с датами, которые находят применение на Data Science-собеседованиях и в обычной работе. При анализе данных весьма часто возникает необходимость извлечения из полей, хранящих даты, их частей, вроде года, дня или месяца. Нередко тому, кто проходит собеседование, предлагают, на основе поля, содержащего дату, вычислить или подсчитать какие-то показатели, сгруппированные по годам или по месяцам. Но подобное поле содержит информацию, сгруппированную по дням, поэтому для решения вышеописанной задачи нужно просто агрегировать данные на уровне месяцев или лет.

Аналитикам, занимающимся самыми разными делами, часто приходится решать подобные задачи. Но при их решении можно столкнуться с некоторыми сложностями. Например:

  1. Существует множество различных функций, которые либо делают одно и то же, либо работают схожим образом, но отличаются в некоторых деталях. Сложно выбрать именно ту функцию, которая нужна при решении конкретной задачи.
  2. В разных диалектах SQL имеются различные функции. Поэтому функция, которая подошла бы при работе с Postgres, может оказаться совсем неподходящей при работе с MySQL.
  3. Столбец в базе данных может иметь неподходящий формат или тип данных. Поэтому придётся потратить некоторое время на преобразование данных и на приведение их в подходящий вид. Это тоже может усложнить задачу.

Работа с датами на Data Science-собеседованиях

Вам предоставлен набор данных, собранный по результатам санитарных проверок. Нужно подсчитать ежегодное количество проверок, в ходе которых были выявлены нарушения в кафе ‘Roxanne Cafe’ . Если в ходе проверки было выявлено нарушение, то в столбце ‘violation_id’ будет присутствовать некое значение. Выведите количество таких проверок с группировкой по годам в нисходящем порядке.

Данные содержатся в таблице sf_restaurant_health_violations , в которой имеются следующие поля:

Имя Тип

Задача это довольно простая, поэтому я не буду детально разбирать её решение. Вместо этого я уделю особое внимание тому, что имеет отношение к работе с датами.

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

Подход к решению задач по работе с базами данных

  1. Посмотрим на данные.
  2. Выберем столбцы, данные которых нужны для ответа на вопрос.

  1. Теперь, ориентируясь в данных, мы можем выбрать те столбцы, которые, как нам известно, помогут нам ответить на вопрос.
  2. В нашем случае это будут столбцы inspection_date , violation_id , business_name .
  1. Ещё один действительно важный этап решения подобных задач заключается в представлении себе того, как должны выглядеть выходные данные, получаемые при взаимодействии с базой данных, и того, как должно выглядеть решение задачи. В частности, речь идёт о том, какие столбцы понадобится включить в выходные данные.
  2. В нашем случае это — год из столбца inspection_date и число проверок, которое будет представлено в виде count() .
  3. Известно, что название кафе и идентификатор нарушения будут использованы для фильтрации данных, а это значит, что они пригодятся при составлении выражения WHERE .

▍Фильтрация данных

Для начала применим фильтр. Обычно я начинаю работу именно с этого шага.

▍Получение необходимых выходных данных

Теперь попытаемся получить необходимые нам выходные данные. Может, для извлечения сведений о годе, в котором проводилась проверка, стоит воспользоваться конструкцией вида EXTRACT(year FROM request_date::DATE) , которая описана здесь и возвращает значение двойной точности?

Но результаты работы этого запроса нас не устроят, так как столбец inspection_date , на самом деле, хранит не дату. Это — объект, который, в соответствии с особенностями платформы, хранит либо текстовые данные, либо данные типа varchar . Для работы этой платформы используется Python, поэтому кое-что из того, что можно тут увидеть, имеет отношение к Python. Со временем мы попытаемся с этим справиться.

Приведём столбец к соответствующему типу, используя либо конструкцию с двумя двоеточиями, либо функцию приведения типов. Два двоеточия — это, в сущности, и есть функция приведения типов, которой можно пользоваться в Postgres. А функции приведения типов могут использоваться и в других диалектах SQL вроде MySQL.

Допустимо, кроме того, поместить YEAR в выражение GROUP BY , так как выражение SELECT выполняется первым. В результате интерпретатору, после выполнения этого выражения, уже будет известно о том, что в запросе имеется столбец с именем YEAR :

▍Важное замечание

Часто нужно изолировать части даты в выражении SELECT — так же, как мы сделали это в нашем примере. Но нередко встречается и необходимость изоляции частей дат в выражении WHERE , что нужно в том случае, когда требуется фильтровать данные. Если нам, например, нужно отобрать только данные, относящиеся к 2015 году, это можно сделать, воспользовавшись соответствующим фильтром:

▍Ещё одно важное замечание

Разные диалекты SQL, например — MySQL, Postgres, Oracle и MS SQL Server, обладают различными функциями для работы с датами. Например, функция EXTRACT() имеется в большинстве диалектов.

Если вы пользуетесь Postgres, это значит, что вам доступна функция date_part() , которая похожа на EXTRACT .

В MySQL можно пользоваться функцией YEAR() .

В других диалектах чего-то наподобие date_part() может и не быть, но в них имеется что-то своё со схожими возможностями. Поэтому не удивляйтесь, если встретитесь с разными функциями, делающими одно и то же.

Итоги

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

Для решения подобных задач тоже существует множество функций. То, какими именно функциями можно пользоваться, зависит от конкретного SQL-диалекта. Я обнаружил, что это в работе с датами вызывает больше всего неприятностей. Многие, включая меня, путаются, попадая в ситуацию, когда существует множество функций, которые, как кажется, решают одну и ту же задачу.

SQL Работа с датами

SQL Работа с датами

Здравствуйте, уважаемые читатели блога LifeExample, все меньше у меня остается времени на подготовку основательных материалов, но пока готовится более весомая статься предлагаю ознакомиться со справочной и очень, порой полезной, информацией, собранной мной с разных уголков рунета. Статья покажет, какая чаще всего востребована в SQL работа с датами.

“Время — ткань, из которой состоит жизнь” сказал Бенджамин Франклин. Интерпретируя данное высказывание в сферу программирования, получим “Время – то, что делает наши приложения живыми“. Работа со временем и датой, открывает новые возможности для простых скриптов.

SQL работа с датами – настолько важна, что без знания основных sql операторов ни в одном стоящем проекте нельзя обойтись. Как ни крути, но во всех сервисах существует надобность работы со временем. Как правило, это вычисление периодов с одной по другую дату, например вывод списка зарегистрировавшихся пользователей за год, месяц, день, час.

Я хочу привести ряд решений на часто встречающиеся задачи по работе с датами в SQL, с которыми сам ежедневно сталкивался, надеюсь, это будет актуально и полезно для вас.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *