将MySQL“Time”字段与PHP中的字符串进行比较

时间:2009-10-18 17:30:50

标签: 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

这似乎可以解决问题。感谢您的帮助。

3 个答案:

答案 0 :(得分:3)

根据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可能会将时间值转换为字符串文字以进行比较,而不是将字符串文字转换为时间值。

答案 1 :(得分:2)

我认为正在发生的事情是'10:00:00'时间被视为一个字符串,而不是时间。这可以解释为什么'07:00:00'给出不同的结果。尝试将值转换为时间...我认为语法类似于:

cast('10:00:00' as time)

答案 2 :(得分:1)

尝试:

  SELECT *
    FROM DATA d
    JOIN USERS u ON u.user_id = d.user_id
   WHERE NOT EXISTS (SELECT NULL 
                       FROM DATA t
                      WHERE t.id = d.id
                        AND CONVERT('10:00:00', TIME) BETWEEN t.start_time AND t.end_time)
GROUP BY u.usrID

当您正确评估BETWEEN时,您会注意到您没有关联子查询 - 只是因为它们是同一个表,并不意味着这两个查询是链接的。