【问题标题】:MySQL Between issue not working with Unix Time StampsMySQL 之间的问题不适用于 Unix 时间戳
【发布时间】:2013-11-15 14:39:33
【问题描述】:

我目前将日期作为 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)!

我是否遗漏了一些关于 between 运算符在 mySQL 中的工作方式的内容?最小值和最大值相同时如何返回行?

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

出了什么问题?

【问题讨论】:

  • 你试过这个吗:WHERE start_date >= :start_date AND start_data <= :end_date

标签: php mysql pdo between


【解决方案1】:

BETWEEN 是一种非常糟糕的匹配日期和时间戳的方法,因为它包含范围的两端。

这可能更适合你

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

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

【讨论】:

  • 我尝试使用这种方法,但奇怪的是我仍然得到完全相同的结果!我刚刚尝试在本月 14 日午夜结束的 86400 秒范围内,我仍然得到 14 日返回的结果。我发送了 138430080 的开始日期和 1384387200 的结束日期,返回的行之一是 1384525509 - 很明显不是
【解决方案2】:

虽然我不知道为什么,但当我把逻辑颠倒过来时,它就完美地工作了。

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

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

WHERE start_date >= :start_date
AND start_date <  :end_date

谁能解释一下原因?

【讨论】:

  • 确保start_date和end_date的时间格式一致!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-22
  • 1970-01-01
相关资源
最近更新 更多