sql - 比较 MySQL "Time"字段与 PHP 中的字符串

标签 sql mysql

我的数据库中有一个特定的行,包含以下信息:

    data:

     user_id     start_time        end_time
       405        12:00:00         14:00:00

我有以下 SELECT 语句:

       SELECT *
         FROM data
         INNER join users on users.user_id = data.user_id
          WHERE NOT EXISTS 
           (SELECT * FROM data 
            WHERE '10:00:00' BETWEEN start_time AND end_time)
            GROUP BY users.usrID");

现在,我认为这个查询会返回上面的行(用户 405),但是,它不会返回任何人。 (因为 10:00:00 不在 12:00:00 和 14:00:00 之间)。

有趣的是,如果我将值 10:00:00 更改为 07:00:00,它可以正常工作。

关于为什么这不起作用的任何想法?在数据库中,我将字段设置为 TIME,它们的格式如下:00:00:00

非常感谢!

更新:

我将查询更改为如下所示:

SELECT usrID, 
       first, 
       last
  FROM users
 WHERE user_id NOT IN (SELECT u.user_id
                         FROM `data` d, 
                              `users` u
                        WHERE d.user_id = u.user_id 
                          AND CAST('10:00:00' AS TIME) BETWEEN start_time AND end_time)
ORDER BY u.user_id

这似乎可以解决问题。感谢所有帮助。

最佳答案

根据 between 的 MySQL 手册页:

“为了在将 BETWEEN 与日期或时间值一起使用时获得最佳结果,您应该使用 CAST() 将值显式转换为所需的数据类型。示例:如果将 DATETIME 与两个 DATE 值进行比较,则将 DATE 值转换为DATETIME 值。如果您在与 DATE 的比较中使用字符串常量(例如“2001-1-1”),请将该字符串转换为 DATE。”

尝试:

SELECT *
FROM data
    INNER join users on users.user_id = data.user_id
WHERE NOT EXISTS 
    (
     SELECT * 
     FROM   data 
     WHERE  CAST('10:00:00' AS TIME) BETWEEN start_time AND end_time
    )
GROUP BY users.usrID

如果没有显式类型转换,MySQL 可能会将时间值转换为字符串文字以进行比较,而不是将字符串文字转换为时间值。

关于sql - 比较 MySQL "Time"字段与 PHP 中的字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1585505/

相关文章:

mysql - 尝试将 mysql 与 jsp 连接时获取 ClassNotFoundException

mysql - Perl 代码始终连接到同一个 MySQL 数据库,尽管它被配置为连接到不同的服务器

php - 数据透视表 Laravel 问题

java - 将数据从 MySQL DB 加载到 Java 应用程序时如何定义列类型?

php - mySQL 如何按年对月份进行分组

sql - PostgreSQL - 替换 HTML 实体

sql - MariaDB JSON 函数与数组

sql - PostgreSQL UNION 仅忽略特定列的重复项

c# - 在特定时间范围后检查新数据

mysql - 将一行的列与另一行的同一列进行比较,如果匹配则更新第三列