扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
在数据库中当然是可以对001和005使用聚合函数max()进行大小比较的,但是我们必须要留意文本型数值和数字型数值在比较数值大小时,数据库引擎对不同的字段数据类型其比较的结果可能会有所不同!下面举例说明一下:
创新互联建站是一家专注于成都网站制作、成都网站设计、外贸营销网站建设与策划设计,蓬江网站建设哪家好?创新互联建站做网站,专注于网站建设十载,网设计领域的专业建站公司;建站业务涵盖:蓬江等地区。蓬江做网站价格咨询:18982081108
比如 10和9,按数字比较大小则 109,但是如果按文本比较大小则 '10''9',因为两个字串比较大小时是从左边第一个字符开始逐个字符进行比较的,一旦分出高低,比较将立即结束不再进行余下比较。'10'开头为1,'9'开头为9首尾字符即可分出大小,这样文本数字'10'就会小于文本数字'9'。我们再来看看001和005,则不论是按数字类型还是按文本类型比较均为前者小于后者,按数字比较的话自然1小于5,若按字串比较,前两位打成平手到第三个字符时就分出了大小。
数据库中字符和字串比较大小的排序规则基本上与我们日常使用的字词典里的排序规则相互吻合,两个字符或字串根据它们在字典中的排序位置我们通常不必依赖电脑运算就可以判断出谁大谁小。
现在我们实测一下使用聚合函数Max()对比文本数据类型字段和数字类型字段的比较结果,以下是SQL实验代码:
drop table if exists t2;
-- 创建测试表t2含文本数据型“数字”字段和数字类型字段
create table t2(id int auto_increment primary key,
charNum varchar(10),digitNum int);
-- 插入测试数据
insert into t2(charNum,digitNum) values
('001',1),('005',5),('0010',10);
-- 查看待测数据
select * from t2;
-- 直接选出文本“数字”字段中的最大值和数字字段中的最大值
select max(charNum) as maxCharNum,
max(digitNum) as maxDigitNum from t2;
-- 将文本“数字”字段转换为数字类型后再选出其最大值,以及直接选出数字字段最大值
select max(convert(charNum,signed)) as maxConvertCharNum,
max(digitNum) as maxDigitNum from t2;
测试截图:
待测数据:
直接对文本和数字两种数据类型字段使用Max()函数的返回结果对比:
我们可以看到直接对文本数据类型字段使用Max函数选出的最大值是“005”而非“0010”
下面是将文本数据类型数字转换为数字数据类型后才使用Max函数的对比结果:
我们可以看到对文本类型字段使用Max函数的最大值已经跟数字数据类型字段的最大值一样了,都是10。
总结:
直接对字符型数据类型字段使用聚合函数Max()、Min()所返回的极值将遵循一般字(词)典对字(词)里设定的排序规则,所选出的最大(小)值不一定是数字意义上的极值,如果需要得出严格数字意义上的极值就必须先进行类型转换,否则得出的结果可能会与期望值有出入。
如果两边都是数字,可以直接用>或<比较,或者用cast转换字段类型后再比较。
我的答案是纯手打的,请认真看,不要浪费我的表情哦~
如果以字符串存储,格式就是 年月日(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
-----------------------------------------------------------------------------------------
参数中的 日期字符串 可以换成 字段名
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流