MySQL之间的问题不适用于Unix时间戳

时间:2013-11-15 14:39:33

标签: php mysql pdo between

我目前将日期作为Unix时间戳存储在mysql版本4.0.8 db(MyISAM引擎)的INT(10)列中。

我查询这些日期以使用以下SQL提取日期范围之间的记录:

$sql = "SELECT `users`.`real_name`, `users`.`user_value`, `clients`.`client_name`, `clients`.`client_stars`, `timing`.`start_date`, `timing`.`end_date`, `projects`.`project_name`
    from timing
    LEFT JOIN users on (users.id = timing.user_id)
    LEFT JOIN clients on (clients.id = timing.client_id)
    LEFT JOIN projects on (projects.project_id = timing.project_id)
    WHERE start_date BETWEEN :start_date AND :end_date";

我正在使用PDO,因此是params。

我100%确定:start_date和:end_date变量在所有情况下都是正确的,因为我已经检查了这些。此外,start_date不含糊,并且没有关于此查询的警告/通知。

我的问题是我没有得到预期的行。如果我要求2013/11/14午夜和2013/11/15午夜之间的行,期望仅来自14日。但是,15日的行也会通过 - 但不是全部。

我刚刚在1384473600和1384473600之间进行了测试 - 这是今天午夜和今天午夜之间(如同时间戳)。

返回的行应为0,但它已从今天返回所有行(例如,返回的第一行的start_date值为1384524193)!

我是否错过了关于Between运算符在mySQL中如何工作的内容?当min和max相同时,如何返回行?

我已经过测试和测试,几乎每次进行查询时,都会返回超出天花板指定范围的行。

出了什么问题?

2 个答案:

答案 0 :(得分:0)

BETWEEN是匹配日期和时间戳的臭名昭着的方法,因为它包含范围的两端。

这可能对您有用

    WHERE start_date >= :start_date
      AND start_date <  :end_date + 86400

幻数86400是一天中的秒数。这将选择:start_date参数包括午夜之间的所有start_date值,然后排除:结束日期之后一天午夜或之后的所有值。如果您使用的是实际时间戳,则可以说+ INTERVAL 1 DAY而不是+ 86400

答案 1 :(得分:0)

虽然我不知道为什么,当我颠倒逻辑时,它完美地运作了。

WHERE timing.start_date < :end_date 
AND timing.start_date >= :start_date

然而,这不起作用,并返回了相同的错误结果。

WHERE start_date >= :start_date
AND start_date <  :end_date

有人可以解释原因吗?