在數(shù)據(jù)庫中當(dāng)然是可以對001和005使用聚合函數(shù)max()進(jìn)行大小比較的,但是我們必須要留意文本型數(shù)值和數(shù)字型數(shù)值在比較數(shù)值大小時,數(shù)據(jù)庫引擎對不同的字段數(shù)據(jù)類型其比較的結(jié)果可能會有所不同!下面舉例說明一下:
創(chuàng)新互聯(lián)建站是一家專注于成都網(wǎng)站制作、成都網(wǎng)站設(shè)計、外貿(mào)營銷網(wǎng)站建設(shè)與策劃設(shè)計,蓬江網(wǎng)站建設(shè)哪家好?創(chuàng)新互聯(lián)建站做網(wǎng)站,專注于網(wǎng)站建設(shè)十載,網(wǎng)設(shè)計領(lǐng)域的專業(yè)建站公司;建站業(yè)務(wù)涵蓋:蓬江等地區(qū)。蓬江做網(wǎng)站價格咨詢:18982081108
比如 10和9,按數(shù)字比較大小則 109,但是如果按文本比較大小則 '10''9',因為兩個字串比較大小時是從左邊第一個字符開始逐個字符進(jìn)行比較的,一旦分出高低,比較將立即結(jié)束不再進(jìn)行余下比較。'10'開頭為1,'9'開頭為9首尾字符即可分出大小,這樣文本數(shù)字'10'就會小于文本數(shù)字'9'。我們再來看看001和005,則不論是按數(shù)字類型還是按文本類型比較均為前者小于后者,按數(shù)字比較的話自然1小于5,若按字串比較,前兩位打成平手到第三個字符時就分出了大小。
數(shù)據(jù)庫中字符和字串比較大小的排序規(guī)則基本上與我們?nèi)粘J褂玫淖衷~典里的排序規(guī)則相互吻合,兩個字符或字串根據(jù)它們在字典中的排序位置我們通常不必依賴電腦運(yùn)算就可以判斷出誰大誰小。
現(xiàn)在我們實測一下使用聚合函數(shù)Max()對比文本數(shù)據(jù)類型字段和數(shù)字類型字段的比較結(jié)果,以下是SQL實驗代碼:
drop table if exists t2;
-- 創(chuàng)建測試表t2含文本數(shù)據(jù)型“數(shù)字”字段和數(shù)字類型字段
create table t2(id int auto_increment primary key,
charNum varchar(10),digitNum int);
-- 插入測試數(shù)據(jù)
insert into t2(charNum,digitNum) values
('001',1),('005',5),('0010',10);
-- 查看待測數(shù)據(jù)
select * from t2;
-- 直接選出文本“數(shù)字”字段中的最大值和數(shù)字字段中的最大值
select max(charNum) as maxCharNum,
max(digitNum) as maxDigitNum from t2;
-- 將文本“數(shù)字”字段轉(zhuǎn)換為數(shù)字類型后再選出其最大值,以及直接選出數(shù)字字段最大值
select max(convert(charNum,signed)) as maxConvertCharNum,
max(digitNum) as maxDigitNum from t2;
測試截圖:
待測數(shù)據(jù):
直接對文本和數(shù)字兩種數(shù)據(jù)類型字段使用Max()函數(shù)的返回結(jié)果對比:
我們可以看到直接對文本數(shù)據(jù)類型字段使用Max函數(shù)選出的最大值是“005”而非“0010”
下面是將文本數(shù)據(jù)類型數(shù)字轉(zhuǎn)換為數(shù)字?jǐn)?shù)據(jù)類型后才使用Max函數(shù)的對比結(jié)果:
我們可以看到對文本類型字段使用Max函數(shù)的最大值已經(jīng)跟數(shù)字?jǐn)?shù)據(jù)類型字段的最大值一樣了,都是10。
總結(jié):
直接對字符型數(shù)據(jù)類型字段使用聚合函數(shù)Max()、Min()所返回的極值將遵循一般字(詞)典對字(詞)里設(shè)定的排序規(guī)則,所選出的最大(小)值不一定是數(shù)字意義上的極值,如果需要得出嚴(yán)格數(shù)字意義上的極值就必須先進(jìn)行類型轉(zhuǎn)換,否則得出的結(jié)果可能會與期望值有出入。
如果兩邊都是數(shù)字,可以直接用>或<比較,或者用cast轉(zhuǎn)換字段類型后再比較。
我的答案是純手打的,請認(rèn)真看,不要浪費我的表情哦~
如果以字符串存儲,格式就是 年月日(20120101等于2012-01-01)的話
首先把 日期字符串 轉(zhuǎn)換成 合格的日期
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 結(jié)束日期 ;
------------------------------------------------------------
第二步,將日期使用日期運(yùn)算函數(shù)進(jìn)行相減:
TIMESTAMPDIFF(返回結(jié)果,日期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 結(jié)束日期 ,
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 相差天數(shù)
;
-------------------------------------------------------------------------------------
不好意思,看錯題目,我以為你是要運(yùn)算。如果是比較,就先把日期轉(zhuǎn)換為時間戳進(jìn)行比較是這樣:
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 開始結(jié)束;
--------------------------------------------------------------------------
直接判斷即可
新建一個數(shù)據(jù)庫來驗證:
CREATE DATABASE test5_4_17
DEFAULT CHARACTER SET utf8
DEFAULT COLLATE UTF8_BIN;
#新建一個test_4_17 使用utf8字符串
USE test5_4_17;
#打開數(shù)據(jù)庫
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; #查看數(shù)據(jù)有了
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) )
)
結(jié)果是
20120303
20120304
-----------------------------------------------------------------------------------------
參數(shù)中的 日期字符串 可以換成 字段名
分享文章:mysql怎么比較數(shù)字 mysql數(shù)字字符串比較大小
文章出自:http://jinyejixie.com/article46/dossheg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供商城網(wǎng)站、域名注冊、面包屑導(dǎo)航、微信小程序、電子商務(wù)、網(wǎng)站收錄
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)