Развивающая задачка для юниоров и не только. Пусть у нас круглосуточная закусочная и в определённое время в ней действуют специальные цены на некоторые ништяки. Запишем условие спеццены как таблицу (блюдо, время_от, время_до, цена). : https://www.db-fiddle.com/f/cupTaNrwzf1XNVXHysuonn/0 'бургер', '00:00:00', '23:59:59', 50 'кола', '10:00:00', '15:00:00', 25 'эспресо', '23:00:00', '02:00:00', 20 Напишите запрос, который будет выводить действующие сейчас позиции. Лучше как запрос на MySQL, но если это для вас сложно, то на PHP. Лишь бы код был безошибочным и красивым.
Шутник. Вообще, это слишком простая задачка, - для юниора или даже для "студента". Я бы предложил для разминки ума немного более сложные условия. Есть табличка: Код (Text): бургер 00:00:00 23:59:59 50.00 кола 10:00:00 15:00:00 25.00 эспресо 23:00:00 02:00:00 20.00 бургер 10:00:00 15:00:00 40.00 кола 12:00:00 13:00:00 20.00 кола 12:45:00 14:00:00 15.00 Задача: Написать оптимальный SQL-запрос, возвращающий список позиций(строк) на заданное время. С условием, что в ответе запроса д.б. "одно наименование - одна позиция(строка)". (т.е. фактически получится прайс-лист на заданное время) п.с. Думаю, что правильный ответ потянет на уровень "мидл+". --- Добавлено --- Ах да, для самоконтроля, - время решения 15-30 минут для мидла+.
я говоря честно синтаксис MySQL уже подзабывать начал но там же вроде можно прям в запросе WHERE и < > использовать и всё или я чего-то недопонял?
@Artur_hopf ответ неверный. Я в первом посте дал ссылку на песочницу. Если в правом поле вколотить твой запрос и кликнуть Run, увидишь результат. Правда current_time будет по времени Гринвича. Поэтому рекомендую в тестовых целях использовать литералы: '10:00:00' или '23:30:00' и т.д.
Спойлер: вариант №1 PHP: SET @curtime = '23:01:00'; SELECT * FROM offers WHERE IF(time_from < time_to ,(@curtime BETWEEN time_from AND time_to) ,( (@curtime BETWEEN time_from AND '23:59:59') OR (@curtime BETWEEN '00:00:00' AND time_to) ) ) ;
Там весь прикол что в 00:00 разрывается день, начинается другой )))) Сначала подумал в лоб: типа составное условие сделать Код (Text): (start_time <time < '00:00:00') || ('00:00:00' <time < end_time) но чето потом попробовал вот так Спойлер Код (Text): SELECT * FROM offers WHERE (TIMESTAMPDIFF(SECOND,time_from,time_to)* TIMESTAMPDIFF(SECOND,time_from,TIME("01:22:22")) >= 0) && (TIMESTAMPDIFF(SECOND,time_from,time_to) >TIMESTAMPDIFF(SECOND,time_from,TIME("01:22:22"))) || (TIMESTAMPDIFF(SECOND,time_from,time_to)* TIMESTAMPDIFF(SECOND,time_from,TIME("01:22:22")) < 0) && (TIMESTAMPDIFF(SECOND,time_from,time_to) <TIMESTAMPDIFF(SECOND,time_from,TIME("01:22:22"))) --- Добавлено --- не очень корректная постановка задачи какую цену показывать в 12:46:00 ? они обе подходят
Парни, задание в первом посте. Цена одна. Спасибо Чушкину за предложение другой усложнённой версии, но нет. Пример хорош пока он простой, поэтому простая задача и предполагаем простое красивое решение. --- Добавлено --- @ADSoft наверное это работает, но зачем так сложно! Я не понимаю что там проиcходит и честно даже не хочется в это погружаться.
https://www.db-fiddle.com/f/cupTaNrwzf1XNVXHysuonn/8 Код (Text): SELECT `name` as `Название`, `price` as `ЦЕНА`, DATE_FORMAT(`start_date`, '%H:%i:%s') as `Начало акции`, DATE_FORMAT(`end_date`, '%H:%i:%s') as `Конец акции`, DATE_FORMAT(CURTIME(), '%H:%i:%s') as `Текущее время` FROM `items` WHERE CURTIME() BETWEEN start_date AND end_date; Не уверен, но будет интересно поглазеть на правильное решение.
@lastdays нет.Ну должно же было тебя насторожить, что как-то слишком всё просто, да? Тем более, что @Artur_hopf уже давал такой же неправильный ответ. Ты не учитываешь специальный случай: когда период акции переваливает через полночь: как с эспрессо. Я думаю можно закончить и подвести итоги. @runcore дал простой и красивый ответ по существу. Также он не поленился сам поместить запрос под спойлер Код (SQL): SET @curtime = '23:01:00'; SELECT * FROM offers WHERE IF(time_from < time_to ,(@curtime BETWEEN time_from AND time_to) ,( (@curtime BETWEEN time_from AND '23:59:59') OR (@curtime BETWEEN '00:00:00' AND time_to) ) ) ; Я сам сделал то же через два IF(): https://www.db-fiddle.com/f/nZqFPVB2o5tPgAzdUGXAC9/0 Вариант runcore мне нравится больше. --- Добавлено --- @ADSoft дал рабочий вариант, но слишком замороченный. Такой код невозможно поддерживать.
И eщё был @Valick в моей личке с неправильными ответами, но с твёрдым убеждением. В паблик постеснялся, видимо.
странный ты человек)) можешь выложить всю переписку сюда целиком, если есть какие-то сомнения в моей стеснительности