比较从Datetime列提取的时间与MariaDB和MySQL中的静态时间

时间:2013-09-09 18:59:28

标签: mysql sql datetime mariadb

我有一个数据库,在一组人之间发送了一堆消息,每条消息都有一个日期时间格式的时间戳。我正在从此日期时间列中提取时间并尝试将其与静态时间戳进行比较,以查看每个用户在此时间之后发送了多少消息。我正在使用的代码如下:

SELECT sender_id, SUM(CASE WHEN DATE_FORMAT(created_at,'%H:%i:%s')>CAST('17:00:00' AS time) THEN 1 ELSE 0 END) AS no_msgs_afterhours GROUP BY sender_id;

有趣的是,这在MariaDB数据库实例中完美有效,但在MySQL实例中它给了我这个错误:

  

ERROR 1267(HY000):非法混合排序   (utf8_general_ci,COERCIBLE)和(latin1_swedish_ci,NUMERIC)   操作'>'

MariaDB实例是版本5.5.32,MySQL实例是5.5.29。这可能是MySQL版本问题吗?我在网上看到,MySQL 4.1.8及更早版本曾经存在类似的整理问题,但这不应该适用于此。

1 个答案:

答案 0 :(得分:1)

这是因为您对服务器和数据库/连接有不同的默认排序规则。 DATE_FORMAT()函数生成latin1_swedish_ci排序规则并将其与数据库排序规则进行比较。

像这样写,它会起作用:

SELECT sender_id, SUM(CASE WHEN TIME(created_at) > CAST('17:00:00' AS time) THEN 1 ELSE 0 END) AS no_msgs_afterhours GROUP BY sender_id;

注意:您缺少FROM子句;)

你甚至不需要施展时间:

SELECT sender_id, SUM(CASE WHEN TIME(created_at) > '17:00:00' THEN 1 ELSE 0 END) AS no_msgs_afterhours GROUP BY sender_id;

您可以看到它如何与这个小测试脚本一起使用:

create table foo (dt datetime, ts timestamp);
insert into foo values (NOW(), NOW());

/*doesn't work*/
SELECT 
CASE WHEN DATE_FORMAT(ts,'%H:%i:%s')>CAST('17:00:00' AS time) THEN 1 ELSE 0 END 
FROM foo;

/*works*/
SELECT 
CASE WHEN DATE_FORMAT(ts,'%H:%i:%s')>'17:00:00'  THEN 1 ELSE 0 END 
FROM foo;

/*works*/
SELECT 
CASE WHEN TIME(ts)>'17:00:00' THEN 1 ELSE 0 END 
FROM foo;

/*works*/
SELECT 
CASE WHEN TIME(ts)>CAST('17:00:00' AS time) THEN 1 ELSE 0 END 
FROM foo;