Одной из самой сложной работы в php считаю запросы в mysql по дате. Во-первых, не всегда логически просто понять что нужно выбрать если у нас сложные условия, типа: выбрать все даты из БД, которые больше такого-то отрезка времени, но меньше текущей даты увеличенной на 25 дней. Во-вторых, возникают другие проблемы от формата до самих запросов.
Начнем с формата хранения даты в БД
Вспомните тип поля timestamp, у него формат времени такой: гггг-мм-дд чч:мм:сс, например: 2017-11-05 14:23:05. Рекомендую использовать в своих базах именно этот формат, т.к. это стандарт. За счет него можно будет выгружать только время или дату, или одновременно то и другое. Не обязательно тип поля брать timestamp, можно использовать обычный text.
Примеры mysql запросов
Теперь рассмотрим практические примеры выборок по дате с учетом того, что дата записана в формате гггг-мм-дд чч:мм:сс:
1. Выбираем все записи в диапазоне: дата в БД select * from ruefz_jcomments where DATE(date)
2. Выбираем данные за текущий месяц: дата в БД > от 1 числа этого месяца и дата select id from tab where date > LAST_DAY(CURDATE()) + INTERVAL 1 DAY — INTERVAL 1 MONTH and date
Расшифровка: выбрать все id записи, в которых дата > последний день месяца сегодняшней даты + 1 день — 1 месяц и дата select ‘
4. За текущую неделю
select id from tab where date > DATE_SUB(CURDATE(), INTERVAL (DAYOFWEEK(CURDATE()) -1) DAY) and date
5. выбираем все записи в диапазоне: (текущая — 10 дней) select * from ruefz_jcomments where DATE(date) = DATE_SUB(NOW(), INTERVAL 10 DAY)
По этим примерам вам будет понятно, как составлять свои решения. Зачастую, при работе с датами вам потребуется использовать запросы DATE_ADD – прибавление, DATE_SUB — вычитание, CURDATE() — сегодняшняя дата, NOW() — сегодняшняя дата и время.
Изменить формат вывода времени в mysql
Если из БД надо взять дату в другом формате, мы можем изменить ее на "лету", для обработки на php скриптах:
DATE_FORMAT(date,format) — Форматирует величину date в соответствии со строкой format.
Пример:
$result = mysql_query("SELECT DATE_FORMAT(‘1997-10-04 22:23:01’, ‘%d.%m.%Y %H:%i:%S’) AS datess FROM csv");
while ($row=mysql_fetch_array($result)) <
echo $row["datess"]."
"; >//05.11.2017 14:23:55
В последнем примере мы приводим дату из БД в читаемый вид для пользователя.
Здравствуйте, уважаемые читатели блога LifeExample, все меньше у меня остается времени на подготовку основательных материалов, но пока готовится более весомая статься предлагаю ознакомиться со справочной и очень, порой полезной, информацией, собранной мной с разных уголков рунета. Статья покажет, какая чаще всего востребована в SQL работа с датами.
“Время — ткань, из которой состоит жизнь” сказал Бенджамин Франклин. Интерпретируя данное высказывание в сферу программирования, получим “Время – то, что делает наши приложения живыми“. Работа со временем и датой, открывает новые возможности для простых скриптов.
SQL работа с датами – настолько важна, что без знания основных sql операторов ни в одном стоящем проекте нельзя обойтись. Как ни крути, но во всех сервисах существует надобность работы со временем. Как правило, это вычисление периодов с одной по другую дату, например вывод списка зарегистрировавшихся пользователей за год, месяц, день, час.
Я хочу привести ряд решений на часто встречающиеся задачи по работе с датами в SQL, с которыми сам ежедневно сталкивался, надеюсь, это будет актуально и полезно для вас.
Имею таблицу вот такого вида:
Не могу сделать выборку по дате и времени. Делаю так:
Но выдаются значения только за последнюю дату.
Подскажите как правильней будет сделать запрос
1 ответ 1
Вам нужно выбирать по сумме даты и времени
необходимо, чтобы изначально существенно ограничить выборку. Если у вас поле DateReaders индексировано, то вначале делаем быструю выборку по индексированному полю, а потом доуточняем ее.
Если же индекса по полю DateReaders нет, то и условие не нужно. В любом случае будет полный перебор записей
А вообще разделение полей даты и времени в 90% плохая архитектура. Если вам не нужны выборки за определенное время для каждого дня, то эти поля нужно объединить в одно поле типа TIMESTAMP