MySQL запрос на возврат строк на основе, если диапазон отметок времени Unix произойдет в этом месяце? - PullRequest
0 голосов
/ 18 декабря 2010

У меня есть такой набор записей, который содержит метки времени Unix для записи дат:

+----+-----------+-----------+---------+
|Id  |Start Date |EndDate    |MoreData |
+----+-----------+-----------+---------+
|1   |1292692439 |2147483647 |...      |
+----+-----------+-----------+---------+
|2   |1272776400 |1274331600 |...      |
+----+-----------+-----------+---------+
|3   |1293256800 |2147483647 |...      |
+----+-----------+-----------+---------+
|4   |1294552800 |2147483647 |...      |
+----+-----------+-----------+---------+

Что мне нужно сделать, это написать запрос MySQL (с использованием PHP), который тольковозвращает строки, содержащие начальную дату, которая находится в этом месяце или до него и конечная дата находится в этом месяце или после него.

Например, в указанном выше наборе записей при запросе этогоВ месяце (декабрь 2010 г.) строки с идентификаторами 2 и 4 возвращать не следует, поскольку конечная дата 2 - в мае 2010 г., а начало 4 - в январе 2011 г.

Помощь в том, как может выглядеть запрос, приветствуется или любые идеис какими командами запросов MySQL может пригодиться при написании этого запроса?

Ответы [ 3 ]

0 голосов
/ 19 декабря 2010

Поскольку вам нужно инициировать запрос из PHP, разумно рассчитать временные метки для первого и последнего дня данного месяца в PHP и передать эти значения в качестве параметров в ваш запрос MySQL.Вам нужно что-то вроде этого:

function get_records_for_date($datestr) {
    $results = array();
    $ts = time();
    if ($datestr) {
        $ts = strtotime($datestr);
    }
    $first_day = mktime(0, 0, 1, date('n', $ts), 1, date('Y', $ts));
    $last_day = mktime(23, 59, 59, date('n', $ts), date('t', $ts), date('Y', $ts));
    $query = "SELECT * FROM yourtable WHERE start_date <= {$last_day} AND end_date >= {$first_day}";
    $query_result = mysql_query($query);
    while ($row = mysql_fetch_assoc($query_result)) {
        $results[] = $row;
    }
    return $results;
}

И затем вы можете вызвать эту функцию без параметра, чтобы получить все записи за текущий месяц, или вы можете передать любую строку даты - которую можно проанализировать с помощью strtotime () - получить записи за определенный месяц.

get_records_for_date();
get_records_for_date('2009-09-12');
get_records_for_date('April 5, 2005');
0 голосов
/ 22 декабря 2010

Я фактически использовал этот формат для проверки дат:

FROM_UNIXTIME(start) <= '2010-12-12' ...etc.

Что было самым простым и простым в реализации.Это было предложено Thrustmaster в комментариях.

0 голосов
/ 18 декабря 2010

Это должно сработать:

SELECT * FROM table WHERE MONTH(FROM_UNIXTIME(start)) <= 12 AND MONTH(FROM_UNIXTIME(end)) >= 12 AND YEAR(FROM_UNIXTIME(start)) <= 2010 AND YEAR(FROM_UNIXTIME(end)) >= 2010
...