对于将日期字段与文字进行比较感到困惑

时间:2013-02-26 03:29:10

标签: mysql sql

我对以下行为感到困惑。为什么第一个SELECT语句返回1而第二个语句返回0?我希望它们都返回1,因为日期大于或等于文字。

为什么排序规则会影响日期比较?将日期与文字进行比较时,将日期(或日期时间)表示为字符串是错误的吗?如果是这样,我应该怎么做日期与文字比较?

mysql> CREATE DATABASE test;
Query OK, 1 row affected (0.00 sec)

mysql> USE test;

mysql> SET NAMES utf8 COLLATE utf8_general_ci;
Query OK, 0 rows affected (0.00 sec)

mysql> CREATE TABLE foo (
  bar date NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
Query OK, 0 rows affected (0.15 sec)

mysql> INSERT INTO foo (bar) VALUES ('2013-01-01');
Query OK, 1 row affected (0.00 sec)

mysql> SELECT COUNT(*) FROM foo WHERE bar >= '2013-01-01 00:00:00';
+----------+
| COUNT(*) |
+----------+
|        1 |
+----------+
1 row in set (0.00 sec)

mysql> SET NAMES utf8 COLLATE utf8_unicode_ci;
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT COUNT(*) FROM foo WHERE bar >= '2013-01-01 00:00:00';
+----------+
| COUNT(*) |
+----------+
|        0 |
+----------+
1 row in set (0.00 sec)

2 个答案:

答案 0 :(得分:0)

你试过吗

SELECT COUNT(*) FROM foo WHERE bar >= _utf8'2013-01-01 00:00:00'

解释here

答案 1 :(得分:0)

您可能认为数据库正在将文字字符串的IMPLICIT类型转换为日期并比较日期。看起来db正在将日期的IMPLICIT类型转换为字符串并比较字符串。排序规则会影响此转化,从而影响您的结果。

尝试:

SET NAMES utf8 COLLATE utf8_general_ci;

SELECT * FROM foo;

SET NAMES utf8 COLLATE utf8_unicode_ci;

SELECT * FROM foo;

这两个查询应该给出解释行为的不同结果。

在任何情况下,cha的建议都会有效,因为你告诉数据库明确地将文字字符串转换为日期,然后比较日期。