【问题标题】:PHP/MySQL Compare against a datePHP/MySQL 与日期比较
【发布时间】:2019-09-18 22:24:18
【问题描述】:

我遇到了一个关于日期时间选择器和 MySQL 的小问题。

我有一个 PHP 脚本应该在所选日期之前(包括)获取记录。但是,数据集返回空。

这是脚本的 SQL 部分:

$sql = 'SELECT `pro_title`,
               `pro_part_number`,
               `name` AS flag_name,
               `old_val`,
               `new_val`
        FROM `products`
        INNER JOIN `flags` ON `id` = `pro_flag_id`
        INNER JOIN `flag_history` ON `pro_part_number` = `part`
        WHERE `pro_flag_id` IN(:flags)
        AND STR_TO_DATE(`ts`, "%y-%m-%d") <= :dateTs;';

然后我使用 PDO 来绑定参数:

array(
    ':flags' => implode(',', $flags), # this outputs 1,2,3
    ':dateTs' => $date # this outputs 2019-04-30
)

我也尝试将 &lt;= 更改为 &gt;= 无济于事(不是说它应该工作,但我想我会尝试)。

我遇到了好几篇 SO 帖子,但实际上没有什么能让我到达那里。以下是flag_history 表的描述(ts 存储的位置)

MariaDB [mastern]> describe `flag_history`;
+---------+-------------+------+-----+-------------------+----------------+
| Field   | Type        | Null | Key | Default           | Extra          |
+---------+-------------+------+-----+-------------------+----------------+
| id      | int(11)     | NO   | PRI | NULL              | auto_increment |
| part    | varchar(25) | NO   |     | NULL              |                |
| ts      | datetime    | YES  |     | CURRENT_TIMESTAMP |                |
| old_val | int(4)      | YES  |     | NULL              |                |
| new_val | int(4)      | YES  |     | NULL              |                |
+---------+-------------+------+-----+-------------------+----------------+

还有一些示例数据:

MariaDB [mastern]> select * from `flag_history` order by `id` desc limit 5;
+-------+----------+---------------------+---------+---------+
| id    | part     | ts                  | old_val | new_val |
+-------+----------+---------------------+---------+---------+
| 24026 | PART-001 | 2019-04-30 09:42:22 |       0 |       3 |
| 24025 | PART-002 | 2019-04-30 09:42:22 |       0 |       3 |
| 24024 | PART-003 | 2019-04-30 09:42:22 |       0 |       3 |
| 24023 | PART-004 | 2019-04-30 09:42:22 |       0 |       3 |
| 24022 | PART-005 | 2019-04-30 09:42:22 |       0 |       3 |
+-------+----------+---------------------+---------+---------+

然后,使用 PART-001 确保 flag_id 已实际设置:

MariaDB [mastern]> select `pro_flag_id` from `products` where `pro_part_number` = "PART-001";
+-------------+
| pro_flag_id |
+-------------+
|           3 |
+-------------+

所以我不太确定出了什么问题,我的逻辑和一切(MySQL newb)看起来应该可以工作,但它给了我空数据。我还尝试将INNER JOIN 更改为LEFT JOIN,但同样无效。

我做错了什么?

【问题讨论】:

  • @DirkScholten 好地方!在代码 + Q 中更正。不幸的是仍然没有修复它
  • @RichardHousham 尝试通过绑定 - 将 PDO::PARAM_STR 添加到 :dateTs 绑定。再次没有:/
  • @treyBake 你能把你的表和它们的值放在一起,这样我们就可以玩弄它并帮助调试它吗?
  • db-fiddle.comsqlfiddle.com 是我以前一直在使用的。当问 SQL 问题时,用你的表/数据和当前查询创建一个小提琴总是有帮助的。让我们这些试图回答的人更容易进行故障排除:-)

标签: php mysql


【解决方案1】:

我设法解决了它。由于我真的在阅读flag_history 表,所以我将主要的SELECT 焦点更改为flag_history,修改了SQL:

$sql = 'SELECT `old_val`, `new_val`, `ts`, `flags`.`name` AS flag_name, `pro_part_number`, `pro_title`
        FROM `flag_history`
        INNER JOIN `products` ON `pro_part_number` = `part`
        INNER JOIN `flags` ON `pro_flag_id` = `flags`.`id`
        WHERE `ts` <= :dateTs;';

我慢慢添加了INNER JOIN,并在使用flag_history 时设法让它工作。我认为问题实际上可能归结为id 字段。作为一个模棱两可的字段(flagsflag_historyid 列)。奇怪的是,我没有得到那个错误(也许因为我没有选择)。无论哪种方式都设法通过更具体地选择我的选择并从读取表而不是加入它来解决它。

进一步说明,从 JOIN 中删除 flags 段会显示约束错误。所以我的猜测是,当我从不同的表中读取时,它并没有第一次显示。

【讨论】:

    猜你喜欢
    • 2015-07-28
    • 1970-01-01
    • 1970-01-01
    • 2011-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多