[Решено] MySQL - сравнение дат без учета года

Тема в разделе "Базы Данных", создана пользователем Master2KAZ, 28 сен 2018.

Метки:
Статус темы:
Закрыта.
  1. Master2KAZ

    Master2KAZ

    Регистрация:
    25 окт 2014
    Сообщения:
    183
    Симпатии:
    72
    Приветствую всех!

    Имеем таблицу:
    Код:
    CREATE TABLE `a_test` (
      `id` int(5) NOT NULL,
      `date_start` date NOT NULL,
      `date_end` date NOT NULL
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    
    --
    -- Дамп данных таблицы `a_test`
    --
    
    INSERT INTO `a_test` (`id`, `date_start`, `date_end`) VALUES
    (1, '2017-01-15', '2017-02-15'),
    (2, '2017-01-01', '2017-02-28'),
    (3, '2017-03-01', '2017-05-15'),
    (4, '2017-02-05', '2017-05-15'),
    (5, '2017-08-15', '2017-09-15'),
    (6, '2017-08-05', '2017-10-12'),
    (7, '2018-08-15', '2018-10-01'),
    (8, '2018-12-25', '2019-01-25');
    Как из этой таблицы получить все строки текущая дата в которых находится между date_start и date_end, но без учета года?

    Т.е. мне нужно получить все строки, в которых, например дата находится между 2 мая и 15 мая любого года.
    --- Добавлено, 28 сен 2018 ---
    Короче, я так подумал - если сначала вытащить месяц и день из даты, а результат превратить в число, то можно сравнивать числа.
    Например, '2017-01-15' и '2017-02-15' == '01-15' и '02-15', получим 115 и 215, можно сравнивать.

    Проблема только, если месяц первой даты будет больше месяца второй даты.
    Например, '2018-12-25' и '2019-01-25' == '12-25' и '01-25', получим 1225 и 125. Но если поставить условие при котором месяц первой даты больше месяца второй даты, то ко второму числу нужно прибавить 1200. Тогда получим, 1225 и 1325.

    В-общем, ничего умнее я пока не придумал:
    Код:
    SELECT * FROM `a_test` WHERE date_format(curdate(), '%m%d')+0 BETWEEN date_format(date_start, '%m%d')+0 AND if((date_end>date_start) AND (month(date_start)>month(date_end)), date_format(date_end, '%m%d')+1200,date_format(date_end, '%m%d')+0)
    Может у кого есть решение по изящнее?
     
  2. Dotrox

    Dotrox Команда форума

    Регистрация:
    27 ноя 2012
    Сообщения:
    3.198
    Симпатии:
    1.305
    В MySQL есть функция DAYOFYEAR, которая позволяет получить номер дня в году из даты. А дальше нужно просто сравнивать их.
     
    Master2KAZ нравится это.
  3. Master2KAZ

    Master2KAZ

    Регистрация:
    25 окт 2014
    Сообщения:
    183
    Симпатии:
    72
    Большое спасибо! Запрос чуть упростился
    Код:
    SELECT * FROM `a_test` WHERE DAYOFYEAR(curdate()) BETWEEN DAYOFYEAR(date_start) AND if((date_end>date_start) AND (month(date_start)>month(date_end)), DAYOFYEAR(date_end)+366, DAYOFYEAR(date_end))
    (Если вдруг кому пригодится!)
     
    $iD нравится это.
Статус темы:
Закрыта.