Как выбрать данные из таблицы?

Здравствуйте. Подскажите, пожалуйста, как выбрать данные из такой таблицы:
id -- title -- startdate -- enddate
1 -- пример -- 10.12.2015 -- 26.10.2016
2 -- пример 2 -- 12.09.2016 -- NULL

Мне необходимо получить события допустим за 9 месяц 2016 года. Как получить вторую строчку понятно, а как первую?
  • Вопрос задан
  • 116 просмотров
Решения вопроса 3
MaxDukov
@MaxDukov
впишусь в проект как SRE/DevOps.
SELECT * from my_tbl WHERE (enddate => '01.09.2016' OR enddate is null) AND  startdate <= '01.09.2016'
Ответ написан
Комментировать
hedint
@hedint
Senior front-end developer
Самый наивный запрос мог бы выглядеть так:
SELECT * FROM tbl WHERE startdate <= "2016-09-30" AND (enddate >= "2016-09-01" OR enddate IS NULL)
Ответ написан
Комментировать
NikitaTratorov
@NikitaTratorov
CTO
Вопрос поставлен как-то странно, ибо у Вас в задании диапазон, а не конкретные даты.
Другими словами, можно понимать, что Вы ищете строки, диапазоны которых пересекают 9й месяц 2016-го года.
Значит получается, что начальная дата строки не должна превышать 2016-09-30, а конечная дата не должна быть раньше 2016-09-01. В упрощенном случае, когда дата начала в строке всегда меньше даты конца (если последняя не NULL), условие получится:
... WHERE (
startdate <= '2016-09-30' AND 
(enddate IS NULL OR (enddate IS NOT NULL AND enddate >='2016-09-01'))
)

IS NULL перенесено в начало, т.к. в другом порядке могут возникать проблемы.
И Вам придется вычислять начальную и конечную дату выбранного месяца. Это можно делать при помощи php
public static function last_day_of_month($date_str = null)
    {
        if (empty($date_str)) {
            return strtotime('23:59:59 last day of this month');
        } else {
            $d = new DateTime($date_str, new DateTimeZone(date_default_timezone_get()));
            return $d->format('t');
        }
    }

    public static function first_day_of_month($timestamp = null)
    {
        if (empty($timestamp))
            return strtotime('00:00:00 first day of this month');
        else
            return strtotime('00:00:00 first day of this month', $timestamp);
    }
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы