За последние 24 часа нас посетили 10688 программистов и 695 роботов. Сейчас ищут 346 программистов ...

Задачка про часы со скидкой

Тема в разделе "MySQL", создана пользователем artoodetoo, 23 дек 2019.

  1. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    10.780
    Симпатии:
    1.160
    Адрес:
    там-сям
    Развивающая задачка для юниоров и не только.

    Пусть у нас круглосуточная закусочная и в определённое время в ней действуют специальные цены на некоторые ништяки.

    Запишем условие спеццены как таблицу (блюдо, время_от, время_до, цена). :

    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. Лишь бы код был безошибочным и красивым.
     
  2. Chushkin

    Chushkin Активный пользователь

    С нами с:
    17 дек 2010
    Сообщения:
    1.060
    Симпатии:
    89
    Адрес:
    Мещёра, Центр, Болото N3
    А сам-то знаешь оптимальное решение? :)
    (SQL, естественно)
     
  3. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    10.780
    Симпатии:
    1.160
    Адрес:
    там-сям
    нет :)
     
    #3 artoodetoo, 24 дек 2019
    Последнее редактирование: 24 дек 2019
    Roman __construct нравится это.
  4. Chushkin

    Chushkin Активный пользователь

    С нами с:
    17 дек 2010
    Сообщения:
    1.060
    Симпатии:
    89
    Адрес:
    Мещёра, Центр, Болото N3
    Шутник. :)

    Вообще, это слишком простая задачка, - для юниора или даже для "студента".
    Я бы предложил для разминки ума немного более сложные условия.
    Есть табличка:
    Код (Text):
    1.  
    2. бургер  00:00:00  23:59:59  50.00
    3. кола    10:00:00  15:00:00  25.00
    4. эспресо 23:00:00  02:00:00  20.00
    5. бургер  10:00:00  15:00:00  40.00
    6. кола    12:00:00  13:00:00  20.00
    7. кола    12:45:00  14:00:00  15.00
    Задача: Написать оптимальный SQL-запрос, возвращающий список позиций(строк) на заданное время.
    С условием, что в ответе запроса д.б. "одно наименование - одна позиция(строка)".
    (т.е. фактически получится прайс-лист на заданное время)

    п.с. Думаю, что правильный ответ потянет на уровень "мидл+". :)
    --- Добавлено ---
    Ах да, для самоконтроля, - время решения 15-30 минут для мидла+.
     
  5. Roman __construct

    Roman __construct Активный пользователь

    С нами с:
    27 апр 2019
    Сообщения:
    1.270
    Симпатии:
    112
    я говоря честно синтаксис MySQL уже подзабывать начал :D но там же вроде можно прям в запросе WHERE и < > использовать и всё :)

    или я чего-то недопонял? :D
     
  6. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    10.780
    Симпатии:
    1.160
    Адрес:
    там-сям
    Легкотня-легкотня. А где решения, господа?
     
  7. Artur_hopf

    Artur_hopf Активный пользователь

    С нами с:
    7 май 2018
    Сообщения:
    2.266
    Симпатии:
    405
    Код (Text):
    1. SELECT *
    2. FROM `offers`
    3. WHERE CURRENT_TIME >=`time_from`
    4. AND  CURRENT_TIME <= `time_to`
     
  8. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    10.780
    Симпатии:
    1.160
    Адрес:
    там-сям
    @Artur_hopf ответ неверный. Я в первом посте дал ссылку на песочницу. Если в правом поле вколотить твой запрос и кликнуть Run, увидишь результат.

    Правда current_time будет по времени Гринвича. Поэтому рекомендую в тестовых целях использовать литералы: '10:00:00' или '23:30:00' и т.д.
     
  9. runcore

    runcore Старожил

    С нами с:
    12 окт 2012
    Сообщения:
    3.625
    Симпатии:
    158
    PHP:
    1. SET @curtime = '23:01:00';
    2.  
    3. SELECT *
    4. FROM offers
    5. WHERE IF(time_from < time_to
    6.         ,(@curtime BETWEEN time_from AND time_to)
    7.         ,(
    8.             (@curtime BETWEEN time_from AND '23:59:59')
    9.                OR (@curtime BETWEEN '00:00:00' AND time_to)
    10.         )
    11.     )
    12. ;
     
    artoodetoo нравится это.
  10. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.511
    Симпатии:
    672
    Адрес:
    Татарстан
    Там весь прикол что в 00:00 разрывается день, начинается другой ))))
    Сначала подумал в лоб: типа составное условие сделать
    Код (Text):
    1. (start_time <time < '00:00:00') || ('00:00:00' <time < end_time)
    но чето потом попробовал вот так
    Код (Text):
    1. SELECT *
    2. FROM offers  WHERE
    3. (TIMESTAMPDIFF(SECOND,time_from,time_to)*
    4. TIMESTAMPDIFF(SECOND,time_from,TIME("01:22:22")) >= 0) &&
    5. (TIMESTAMPDIFF(SECOND,time_from,time_to)
    6. >TIMESTAMPDIFF(SECOND,time_from,TIME("01:22:22"))) ||
    7.                                      (TIMESTAMPDIFF(SECOND,time_from,time_to)*
    8. TIMESTAMPDIFF(SECOND,time_from,TIME("01:22:22")) < 0) &&
    9. (TIMESTAMPDIFF(SECOND,time_from,time_to)
    10. <TIMESTAMPDIFF(SECOND,time_from,TIME("01:22:22")))
    --- Добавлено ---
    не очень корректная постановка задачи
    какую цену показывать в 12:46:00 ? они обе подходят
     
    #10 ADSoft, 24 дек 2019
    Последнее редактирование модератором: 24 дек 2019
  11. Valick

    Valick Активный пользователь

    С нами с:
    12 авг 2018
    Сообщения:
    1.911
    Симпатии:
    328
    меньшую
     
  12. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    10.780
    Симпатии:
    1.160
    Адрес:
    там-сям
    Парни, задание в первом посте. Цена одна. Спасибо Чушкину за предложение другой усложнённой версии, но нет.
    Пример хорош пока он простой, поэтому простая задача и предполагаем простое красивое решение.
    --- Добавлено ---
    @ADSoft наверное это работает, но зачем так сложно! Я не понимаю что там проиcходит и честно даже не хочется в это погружаться.
     
  13. lastdays

    lastdays Активный пользователь

    С нами с:
    27 сен 2012
    Сообщения:
    410
    Симпатии:
    73
    https://www.db-fiddle.com/f/cupTaNrwzf1XNVXHysuonn/8

    Код (Text):
    1.      SELECT
    2.       `name` as `Название`,
    3.       `price` as `ЦЕНА`,
    4.        DATE_FORMAT(`start_date`, '%H:%i:%s') as `Начало акции`,
    5.        DATE_FORMAT(`end_date`, '%H:%i:%s') as `Конец акции`,
    6.        DATE_FORMAT(CURTIME(), '%H:%i:%s') as `Текущее время`
    7.      FROM
    8.       `items`
    9.      WHERE
    10.       CURTIME() BETWEEN
    11.       start_date
    12.       AND
    13.       end_date;
    Не уверен, но будет интересно поглазеть на правильное решение.
     
  14. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    10.780
    Симпатии:
    1.160
    Адрес:
    там-сям
    @lastdays нет.Ну должно же было тебя насторожить, что как-то слишком всё просто, да? Тем более, что @Artur_hopf уже давал такой же неправильный ответ. Ты не учитываешь специальный случай: когда период акции переваливает через полночь: как с эспрессо.

    Я думаю можно закончить и подвести итоги.

    @runcore дал простой и красивый ответ по существу. Также он не поленился сам поместить запрос под спойлер :)

    Код (SQL):
    1. SET @curtime = '23:01:00';
    2.  
    3. SELECT *
    4. FROM offers
    5. WHERE IF(time_from < time_to
    6.         ,(@curtime BETWEEN time_from AND time_to)
    7.         ,(
    8.             (@curtime BETWEEN time_from AND '23:59:59')
    9.                OR (@curtime BETWEEN '00:00:00' AND time_to)
    10.         )
    11.     )
    12. ;
    Я сам сделал то же через два IF(): https://www.db-fiddle.com/f/nZqFPVB2o5tPgAzdUGXAC9/0
    Вариант runcore мне нравится больше.
    --- Добавлено ---
    @ADSoft дал рабочий вариант, но слишком замороченный. Такой код невозможно поддерживать.
     
  15. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    10.780
    Симпатии:
    1.160
    Адрес:
    там-сям
    И eщё был @Valick в моей личке с неправильными ответами, но с твёрдым убеждением. :) В паблик постеснялся, видимо.
     
  16. Valick

    Valick Активный пользователь

    С нами с:
    12 авг 2018
    Сообщения:
    1.911
    Симпатии:
    328
    странный ты человек))
    можешь выложить всю переписку сюда целиком, если есть какие-то сомнения в моей стеснительности
     
  17. AlexandrS

    AlexandrS Активный пользователь

    С нами с:
    30 сен 2017
    Сообщения:
    659
    Симпатии:
    103
    Адрес:
    Краснодар
    Уверен, что задача не пошла, т.к. была допущена синтаксическая ошибка в коде :D
    эспресо -> эспреССо
    :)