扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
字符串比较大小不是比较长短
创新互联基于成都重庆香港及美国等地区分布式IDC机房数据中心构建的电信大带宽,联通大带宽,移动大带宽,多线BGP大带宽租用,是为众多客户提供专业服务器托管报价,主机托管价格性价比高,为金融证券行业服务器托管雅安,ai人工智能服务器托管提供bgp线路100M独享,G口带宽及机柜租用的专业成都idc公司。
从第一个字符开始比较,相同相等,遇到不同就比较出来了abc,根据ascii码比较的
abcdabcde
我的答案是纯手打的,请认真看,不要浪费我的表情哦~
如果以字符串存储,格式就是 年月日(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
-----------------------------------------------------------------------------------------
参数中的 日期字符串 可以换成 字段名
问题:
返回结果错误;
明明没有' '的行,居然匹配一堆数据;
对比发现返回的都是''匹配的行
验证:
有趣的是,
google答案:
这个失败的原因在这里的文档 中解释:
CHAR和VARCHAR列中的值按照排序和比较 到分配给列的字符集整理。
所有MySQL串联都是类型的PADSPACE.这意味着所有CHAR, 将MySQL中的varchar和TEXT值进行比较,而不考虑任何内容 在这种情况下,“比较”不包括 像pattern-matching运算符,尾随空间是 重要。
解决这个问题的一种方法是将其转换为BINARY
您还可以使用LIKE:
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流