返回结果错误;
明明没有' '的行,居然匹配一堆数据;
对比发现返回的都是''匹配的行
验证:
有趣的是,
google答案:
这个失败的原因在这里的文档 http://dev.mysql.com/doc/refman/5.0/en/char.html 中解释:
CHAR和VARCHAR列中的值按照排序和比较 到分配给列的字符集整理。
所有MySQL串联都是类型的PADSPACE.这意味着所有CHAR, 将MySQL中的varchar和TEXT值进行比较,而不考虑任何内容 在这种情况下,“比较”不包括 像pattern-matching运算符,尾随空间是 重要。
解决这个问题的一种方法是将其转换为BINARY
您还可以使用LIKE:
mysql速度稍快18%,varchar和bigint相等。1、varchar和bigint性能差不多,mysql速度稍快18%在数据存储、读写方面,整数与等长字符串相同,mysql额外多了一个字节性能会有影响。
我的答案是纯手打的,请认真看,不要浪费我的表情哦~
如果以字符串存储,格式就是 年月日(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
-----------------------------------------------------------------------------------------
参数中的 日期字符串 可以换成 字段名
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)