我目前将日期作为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,因此是参数。
我 100% 确定 :start_date 和 :end_date 变量在所有情况下都是正确的,因为我已经检查了这些。此外,start_date没有模棱两可,也没有关于此查询的警告/通知。
我的问题是我没有得到预期的行。如果我要求在午夜 2013/11/14 和午夜 2013/11/15 之间行,则期望仅从 14 日开始。但是,也会传递第 15 个行 - 但不是全部。
我也刚刚在 1384473600 和 1384473600 之间进行了测试 - 即今天午夜和今天午夜之间(如在同一时间戳中)。
返回的行应该是 0,但它已经返回了今天的所有行(例如,返回的第一行的start_date值为 1384524193)!
我是否错过了有关 mySQL 中 between 运算符如何工作的内容?当最小值和最大值相同时,它如何返回行?
我已经测试和测试,几乎每次我进行查询时,都会返回高于指定上限的行。
出了什么问题?
BETWEEN
是匹配日期和时间戳的糟糕方式,因为它包含范围的两端。
这可能更适合您
WHERE start_date >= :start_date
AND start_date < :end_date + 86400
86400
的幻数是一天中的秒数。这将选择午夜(包括 :start_date 参数(含)之间的所有start_date值,然后排除 :结束日期后一天午夜或之后的所有值。 如果您使用的是实际时间戳,则可以说+ INTERVAL 1 DAY
而不是+ 86400
。
虽然我不知道为什么,但当我颠倒逻辑时,它完美地工作了。
WHERE timing.start_date < :end_date
AND timing.start_date >= :start_date
但是,这不起作用,并返回了相同的错误结果。
WHERE start_date >= :start_date
AND start_date < :end_date
谁能解释为什么?