MySQL查询根据unix时间戳范围是否在本月发生返回行?

时间:2010-12-18 16:26:10

标签: php mysql sql unix-timestamp

我有一个这样的记录集,包含 unix时间戳来记录日期:

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

我需要做的是编写一个MySQL查询(使用PHP),该查询仅返回包含本月或之前的开始日期的行结束日期在本月或之后。

例如,在上述记录集中,如果查询本月(2010年12月),则不应返回id为2和4的行,因为2的enddate是在2010年5月,4的startdate是在2011年1月。

在编写此查询时,非常感谢有关查询外观的帮助,或者有任何关于MySQL查询命令可能有用的想法吗?

3 个答案:

答案 0 :(得分:0)

这应该可以解决问题:

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

答案 1 :(得分:0)

由于您需要从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');

答案 2 :(得分:-1)

我实际上使用这种格式来测试日期:

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

哪个是最简单,最简单的实现方式。 Thrustmaster在评论中提出了建议。