返回结果错误;
明明没有' '的行,居然匹配一堆数据;
对比发现返回的都是''匹配的行
验证:
有趣的是,
google答案:
这个失败的原因在这里的文档 http://dev.mysql.com/doc/refman/5.0/en/char.html 中解释:
CHAR和VARCHAR列中的值按照排序和比较 到分配给列的字符集整理。
所有MySQL串联都是类型的PADSPACE.这意味着所有CHAR, 将MySQL中的varchar和TEXT值进行比较,而不考虑任何内容 在这种情况下,“比较”不包括 像pattern-matching运算符,尾随空间是 重要。
解决这个问题的一种方法是将其转换为BINARY
您还可以使用LIKE:
我的答案是纯手打的,请认真看,不要浪费我的表情哦~
如果以字符串存储,格式就是 年月日(20120101等于2012-01-01)的话
首先把 日期字符串 转换成 合格的日期
concat_ws(连接符号,字符串1,字符串2...)
第一步代码:
SELECT
CONCAT_WS('-',
SUBSTRING('20120101',1,4),
SUBSTRING('20120101',5,2),
SUBSTRING('20120101',7,2) ) AS 开始日期 ,
CONCAT_WS('-',
SUBSTRING('20120608',1,4),
SUBSTRING('20120608',5,2),
SUBSTRING('20120608',7,2) ) AS 结束日期
------------------------------------------------------------
第二步,将日期使用日期运算函数进行相减:
TIMESTAMPDIFF(返回结果,日期1,日期2)
最终代码:
SELECT
CONCAT_WS('-',
SUBSTRING('20120101',1,4),
SUBSTRING('20120101',5,2),
SUBSTRING('20120101',7,2) ) AS 开始日期 ,
CONCAT_WS('-',
SUBSTRING('20120608',1,4),
SUBSTRING('20120608',5,2),
SUBSTRING('20120608',7,2) ) AS 结束日期 ,
TIMESTAMPDIFF(
DAY,
CONCAT_WS('-',
SUBSTRING('20120101',1,4),
SUBSTRING('20120101',5,2),
SUBSTRING('20120101',7,2) ) ,
CONCAT_WS('-',
SUBSTRING('20120608',1,4),
SUBSTRING('20120608',5,2),
SUBSTRING('20120608',7,2) )
) AS 相差天数
-------------------------------------------------------------------------------------
不好意思,看错题目,我以为你是要运算。如果是比较,就先把日期转换为时间戳进行比较是这样:
unix_timestamp(日期)
SELECT
unix_timestamp(
CONCAT_WS('-',
SUBSTRING('20120101',1,4),
SUBSTRING('20120101',5,2),
SUBSTRING('20120101',7,2) )
) AS 开始日期,
unix_timestamp(
CONCAT_WS('-',
SUBSTRING('20120608',1,4),
SUBSTRING('20120608',5,2),
SUBSTRING('20120608',7,2) )
) AS 开始结束
--------------------------------------------------------------------------
直接判断即可
新建一个数据库来验证:
CREATE DATABASE test5_4_17
DEFAULT CHARACTER SET utf8
DEFAULT COLLATE UTF8_BIN
#新建一个test_4_17 使用utf8字符串
USE test5_4_17
#打开数据库
CREATE TABLE test(
id INT PRIMARY KEY NOT NULL AUTO_INCREMENT,
date_v VARCHAR(30) NOT NULL
)
INSERT INTO test VALUES(NULL,'20110303')
INSERT INTO test VALUES(NULL,'20120303')
INSERT INTO test VALUES(NULL,'20120304')
INSERT INTO test VALUES(NULL,'20130303')
SELECT * FROM test#查看数据有了
SELECT * FROM
test
WHERE
UNIX_TIMESTAMP(date_v) >=
unix_timestamp(
CONCAT_WS('-',
SUBSTRING('20120101',1,4),
SUBSTRING('20120101',5,2),
SUBSTRING('20120101',7,2) )
)
AND
UNIX_TIMESTAMP(date_v) <=
unix_timestamp(
CONCAT_WS('-',
SUBSTRING('20120608',1,4),
SUBSTRING('20120608',5,2),
SUBSTRING('20120608',7,2) )
)
结果是
20120303
20120304
-----------------------------------------------------------------------------------------
参数中的 日期字符串 可以换成 字段名
SQL中比较两个字符串的大小的规则和C/C++、Java、Python等众多主流语言的规则相同,或者说是编程语言通用的规则:逐一比较对应位字符的ANSI码/Unicode码。若相同继续比较下一个字符,直到第一次出现不同,或其中一个字符串到达结尾。该位编码值较小的或已到达结尾的字符串被认为小于另一个字符串。欢迎分享,转载请注明来源:内存溢出
评论列表(0条)