0

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

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

我需要做的是编写一个 MySQL 查询(使用 PHP),它只返回包含本月或之前的 startdate 和本月之后的 enddate 的行。

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

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

4

3 回答 3

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
于 2010-12-18T16:36:27.123 回答
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');
于 2010-12-19T03:06:51.057 回答
-1

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

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

这是最容易和最容易实现的。这是 Thrustmaster 在评论中建议的。

于 2010-12-22T20:16:40.390 回答