關(guān)于mysql時(shí)間區(qū)間問(wèn)題淺析
一、between……and……
SELECT * FROM 表名 WHERE 開(kāi)始時(shí)間字段名 BETWEEN '2018-09-01' AND '2018-09-14';
發(fā)現(xiàn)9月14號(hào)的數(shù)據(jù)沒(méi)有出來(lái),那就證明between……and……是左閉右開(kāi),即[a,b),包含a的值,不包含b的值。
將上面代碼修改下面的語(yǔ)句即可,將原來(lái)的日期加上一天,就行。
select * from 表名 where 字段名 BETWEEN '2018-08-08' and DATE_ADD('2018-09-14',INTERVAL 1 DAY);
這個(gè)問(wèn)題其實(shí)代入到數(shù)學(xué)中很簡(jiǎn)單。
我測(cè)試的時(shí)候和同事說(shuō)沒(méi)有包含這一天的數(shù)據(jù),還爭(zhēng)論了半天,其實(shí)是因?yàn)樗季S的問(wèn)題,程序員的思維和正常人的思維是有一定差異的。就像我有時(shí)候就會(huì)從0開(kāi)始數(shù)東西,到最后發(fā)現(xiàn)不對(duì)。當(dāng)然生活中還是要正常,工作中不正常的需求太多了。
二、<和>問(wèn)題
我的項(xiàng)目用的mybatis,下面就是截取mapper的一部分,其實(shí)和上面的between一樣的用法
<if test="開(kāi)始時(shí)間字段名 != null and 開(kāi)始時(shí)間字段名 != ''">
AND 開(kāi)始時(shí)間字段名 >= #{前臺(tái)傳的值}
</if>
<if test="結(jié)束時(shí)間字段名!= null and 結(jié)束時(shí)間字段名!= ''">
AND 結(jié)束時(shí)間字段名 <= DATE_ADD(#{前臺(tái)傳的值},INTERVAL 1 DAY)
</if>
三、在java代碼中拼接
在代碼中拼接,用上面的<和>查詢(xún),簡(jiǎn)單粗暴,只是記錄一下實(shí)現(xiàn)方法
if(StringUtils.isNotEmpty(beginDate)){
params.put("beginDate",beginDate+" 00:00:00");
}
if(StringUtils.isNotEmpty(endDate)){
params.put("endDate",endDate + " 23:59:59");
}
四、轉(zhuǎn)變格式查詢(xún)
問(wèn)題描述:db存的格式一般是“yyyy-MM-dd HH:mm:ss”,但是前臺(tái)查詢(xún)并不會(huì)這樣精確,往往會(huì)傳“yyyy-MM-dd”格式的,像上面的拼接就會(huì)顯得極及的LOW,在XXXMapper.xml的sql語(yǔ)句中完成會(huì)很優(yōu)雅。
AND DATE_FORMAT(存日期的字段, '%Y-%m-%d') >= #{Entity日期屬性}
附:Mysql如何實(shí)現(xiàn)指定時(shí)間區(qū)間的所有日期
Mysql沒(méi)有遞歸查詢(xún),是如何實(shí)現(xiàn)指定日期查詢(xún)的:mysql.help_topic 這時(shí)候就可以使用mysql自帶的這個(gè)表來(lái)實(shí)現(xiàn)。(算是取巧的方法,暫時(shí)沒(méi)找到更好的方法)
SELECT DATE_FORMAT( date_add(concat('2019-01-01'), interval(help_topic_id) DAY),'%Y-%m-%d') DT
FROM mysql.help_topic
WHERE help_topic_id <= timestampdiff(DAY,concat('2019-01-01'),concat('2019-12-01'))
總結(jié)
到此這篇關(guān)于mysql時(shí)間區(qū)間問(wèn)題的文章就介紹到這了,更多相關(guān)mysql時(shí)間區(qū)間問(wèn)題內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
MySQL數(shù)據(jù)庫(kù)配置優(yōu)化的方案
我們總是希望MySQL能夠獲得更高的查詢(xún)性能,最好的辦法是弄清楚MySQL是如何優(yōu)化和執(zhí)行查詢(xún)的。本文講解MySQL在各個(gè)方面的優(yōu)化方向,方便后端開(kāi)發(fā)人員在調(diào)優(yōu)和問(wèn)題排查過(guò)程中找到切入點(diǎn)2023-02-02
MySQL數(shù)據(jù)庫(kù)InnoDB數(shù)據(jù)恢復(fù)工具的使用小結(jié)詳解
本篇文章是對(duì)MySQL數(shù)據(jù)庫(kù)InnoDB數(shù)據(jù)恢復(fù)工具的使用進(jìn)行了詳細(xì)的總結(jié)與分析,需要的朋友參考下2013-06-06
sql中select into和insert select的用法小結(jié)
在工作中,我們經(jīng)常需要備份表,本文主要介紹了sql中select into和insert select的用法小結(jié),具有一定的參考價(jià)值,感興趣的可以了解一下2024-08-08
詳解MySQL執(zhí)行原理、邏輯分層、更改數(shù)據(jù)庫(kù)處理引擎
在本文里我們給大家總結(jié)了關(guān)于MySQL執(zhí)行原理、邏輯分層、更改數(shù)據(jù)庫(kù)處理引擎的相關(guān)知識(shí)點(diǎn),需要的讀者們一起學(xué)習(xí)下。2019-02-02
詳解MySQL多版本并發(fā)控制機(jī)制(MVCC)源碼
MVCC,即多版本并發(fā)控制(Multi-Version Concurrency Control)指的是,通過(guò)版本鏈維護(hù)一個(gè)數(shù)據(jù)的多個(gè)版本,使得讀寫(xiě)操作沒(méi)有沖突,可保證不同事務(wù)讀寫(xiě)、寫(xiě)讀操作并發(fā)執(zhí)行,提高系統(tǒng)性能2021-06-06

