gpt4 book ai didi

php - MySQL Between 问题不适用于 Unix 时间戳

转载 作者:行者123 更新时间:2023-11-30 23:10:26 25 4
gpt4 key购买 nike

我目前将日期作为 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,但它返回了今天的所有行(例如返回的第一行的开始日期值为 1384524193)!

我是不是漏掉了 mySQL 中 between 运算符的工作原理?当最小值和最大值相同时,它如何返回行?

我已经测试了又测试,几乎每次我进行查询时,都会返回超出指定上限的行。

出了什么问题?

最佳答案

BETWEEN 是众所周知的错误匹配日期和时间戳的方法,因为它包含范围的两端。

这可能更适合你

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

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

关于php - MySQL Between 问题不适用于 Unix 时间戳,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20003568/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com