關(guān)于mysql時間區(qū)間問題淺析
一、between……and……
SELECT * FROM 表名 WHERE 開始時間字段名 BETWEEN '2018-09-01' AND '2018-09-14';
發(fā)現(xiàn)9月14號的數(shù)據(jù)沒有出來,那就證明between……and……是左閉右開,即[a,b),包含a的值,不包含b的值。
將上面代碼修改下面的語句即可,將原來的日期加上一天,就行。
select * from 表名 where 字段名 BETWEEN '2018-08-08' and DATE_ADD('2018-09-14',INTERVAL 1 DAY);
這個問題其實代入到數(shù)學(xué)中很簡單。
我測試的時候和同事說沒有包含這一天的數(shù)據(jù),還爭論了半天,其實是因為思維的問題,程序員的思維和正常人的思維是有一定差異的。就像我有時候就會從0開始數(shù)東西,到最后發(fā)現(xiàn)不對。當(dāng)然生活中還是要正常,工作中不正常的需求太多了。
二、<和>問題
我的項目用的mybatis,下面就是截取mapper的一部分,其實和上面的between一樣的用法
<if test="開始時間字段名 != null and 開始時間字段名 != ''"> AND 開始時間字段名 >= #{前臺傳的值} </if> <if test="結(jié)束時間字段名!= null and 結(jié)束時間字段名!= ''"> AND 結(jié)束時間字段名 <= DATE_ADD(#{前臺傳的值},INTERVAL 1 DAY) </if>
三、在java代碼中拼接
在代碼中拼接,用上面的<和>查詢,簡單粗暴,只是記錄一下實現(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)變格式查詢
問題描述:db存的格式一般是“yyyy-MM-dd HH:mm:ss”,但是前臺查詢并不會這樣精確,往往會傳“yyyy-MM-dd”格式的,像上面的拼接就會顯得極及的LOW,在XXXMapper.xml的sql語句中完成會很優(yōu)雅。
AND DATE_FORMAT(存日期的字段, '%Y-%m-%d') >= #{Entity日期屬性}
附:Mysql如何實現(xiàn)指定時間區(qū)間的所有日期
Mysql沒有遞歸查詢,是如何實現(xiàn)指定日期查詢的:mysql.help_topic 這時候就可以使用mysql自帶的這個表來實現(xiàn)。(算是取巧的方法,暫時沒找到更好的方法)
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時間區(qū)間問題的文章就介紹到這了,更多相關(guān)mysql時間區(qū)間問題內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
利用Shell腳本實現(xiàn)遠(yuǎn)程MySQL自動查詢
本篇文章是對利用Shell腳本實現(xiàn)遠(yuǎn)程MySQL自動查詢的方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-06-06如何用mysql自帶的定時器定時執(zhí)行sql(每天0點執(zhí)行與間隔分/時執(zhí)行)
在開發(fā)過程中經(jīng)常會遇到這樣一個問題,每天或者每月必須定時去執(zhí)行一條sql語句或更新或刪除或執(zhí)行特定的sql語句,下面這篇文章主要給大家介紹了關(guān)于如何用mysql自帶的定時器定時執(zhí)行sql(每天0點執(zhí)行與間隔分/時執(zhí)行)的相關(guān)資料,需要的朋友可以參考下2023-03-03