MySQL的DATE_FORMAT函數(shù)的使用
假設(shè)某寶為鼓勵(lì)大家雙12買買買,獎(jiǎng)勵(lì)雙十一那天訂單最多的兩位用戶:分別是用戶1:“剁手皇帝陳哈哈” 和 用戶2:“觸手怪劉大莉” 一人一萬(wàn)元;
需求1:讓你通過(guò)MySQL訂單表,統(tǒng)計(jì)一下雙11那天,這兩位每小時(shí)的購(gòu)買訂單成交數(shù);你會(huì)怎么寫(xiě)這條SQL呢?
記得幾年前我剛接觸MySQl,年少輕狂,在得知不用考慮效率的情況下,我寫(xiě)了個(gè)接口循環(huán)二十四遍,發(fā)送24條SQL去查(捂臉),由于那個(gè)接口,被技術(shù)經(jīng)理嘲諷~~表示他寫(xiě)的SQL比我吃的米都多。雖然我們山東人基本不吃米飯,但我還是羞愧不已。。
然后經(jīng)理通過(guò)調(diào)用一個(gè)DATE_FORMAT函數(shù)分組查詢處理一下,就ok了,效率是我的幾十倍吧。從那時(shí)起,我暗自計(jì)劃要深入研究SQL技巧。
第二天,由于和朋友開(kāi)黑打了兩把王者,計(jì)劃延后了幾年~
在MySQL中對(duì)于處理時(shí)間字段,有專門封裝的DATE_FORMAT函數(shù),可以說(shuō),DATE_FORMAT函數(shù)可以基本滿足任何時(shí)間字段的處理需求。
DATE_FORMAT(date,format) 函數(shù)參數(shù)解析:
1、date:代表具體時(shí)間字段,也可以為now()查詢當(dāng)前時(shí)間;2、format:DATE_FORMAT將傳來(lái)的Date類型數(shù)據(jù)轉(zhuǎn)為自己需要的格式,如%Y-%m-%d %H:%i:%s會(huì)將傳來(lái)的Time數(shù)據(jù)轉(zhuǎn)為'yyyy-MM-dd HH:mm:ss'格式%Y-%m-%d %H:%i:%s 與 yyyy-MM-dd HH:mm:ss 相對(duì)應(yīng),也是最常用的格式,這里舉幾個(gè)簡(jiǎn)單的栗子如下;
SELECT DATE_FORMAT(NOW(),’%Y-%m-%d %H:%i:%s’); -- 結(jié)果:2020-12-07 22:18:58SELECT DATE_FORMAT(NOW(),’%Y-%m-%d %H:%i’); -- 結(jié)果:2020-12-07 22:18SELECT DATE_FORMAT(NOW(),’%Y-%m-%d %H’); -- 結(jié)果:2020-12-07 22SELECT DATE_FORMAT(NOW(),’%Y-%m-%d’); -- 結(jié)果:2020-12-07SELECT DATE_FORMAT(NOW(),’%H:%i:%s’); -- 結(jié)果:22:18:58SELECT DATE_FORMAT(NOW(),’%H’); -- 結(jié)果:22
對(duì)于上面的需求1,用DATE_FORMAT函數(shù)的查詢方式如下:
SELECT name as ’用戶名’,DATE_FORMAT(createTime,’%Y-%m-%d %H’) as ’時(shí)間/小時(shí)’,count(*) as ’訂單量’ from t_order where DATE_FORMAT(createTime,’%Y-%m-%d’) = ’2020-11-11’ GROUP BY DATE_FORMAT(createTime,’%Y-%m-%d %H’);
查詢結(jié)果:
mysql> SELECT name as ’用戶名’,DATE_FORMAT(createTime,’%Y-%m-%d %H’) as ’時(shí)間/小時(shí)’,count(*) as ’訂單量’ from t_order where DATE_FORMAT(createTime,’%Y-%m-%d’) = ’2020-11-11’ GROUP BY DATE_FORMAT(createTime,’%Y-%m-%d %H’);+------------------+---------------+-----------+| 用戶名 | 時(shí)間/小時(shí) | 訂單量 |+------------------+---------------+-----------+| 剁手皇帝陳哈哈 | 2020-11-11 00 | 0 || 剁手皇帝陳哈哈 | 2020-11-11 01 | 10 || 剁手皇帝陳哈哈 | 2020-11-11 02 | 6 || 剁手皇帝陳哈哈 | 2020-11-11 03 | 3 || 剁手皇帝陳哈哈 | 2020-11-11 04 | 0 || 剁手皇帝陳哈哈 | 2020-11-11 05 | 0 || 剁手皇帝陳哈哈 | 2020-11-11 06 | 0 || 剁手皇帝陳哈哈 | 2020-11-11 07 | 0 || 剁手皇帝陳哈哈 | 2020-11-11 08 | 0 || 剁手皇帝陳哈哈 | 2020-11-11 09 | 0 || 剁手皇帝陳哈哈 | 2020-11-11 10 | 0 || 剁手皇帝陳哈哈 | 2020-11-11 11 | 0 || 剁手皇帝陳哈哈 | 2020-11-11 12 | 12 || 剁手皇帝陳哈哈 | 2020-11-11 13 | 6 || 剁手皇帝陳哈哈 | 2020-11-11 14 | 3 || 剁手皇帝陳哈哈 | 2020-11-11 15 | 7 || 剁手皇帝陳哈哈 | 2020-11-11 16 | 2 || 剁手皇帝陳哈哈 | 2020-11-11 17 | 3 || 剁手皇帝陳哈哈 | 2020-11-11 18 | 11 || 剁手皇帝陳哈哈 | 2020-11-11 19 | 2 || 剁手皇帝陳哈哈 | 2020-11-11 20 | 1 || 剁手皇帝陳哈哈 | 2020-11-11 21 | 3 || 剁手皇帝陳哈哈 | 2020-11-11 22 | 2 || 剁手皇帝陳哈哈 | 2020-11-11 23 | 0 |+------------------+---------------+-----------+24 rows in set (0.00 sec)
這里的GROUP BY DATE_FORMAT(createTime,’%Y-%m-%d %H’)代表的是“年月日 + 小時(shí)”合在一起為單位,具體到的是某天的小時(shí);
當(dāng)然,也可以寫(xiě)成以下兩種形式,都是按小時(shí)來(lái)劃分,但是…:
1、GROUP BY DATE_FORMAT(createTime,’%H’)2、GROUP BY HOUR(createTime)需要注意的是,當(dāng)where條件指定了某一天時(shí),這三種的作用是相同的,但如果where條件沒(méi)指定某一天,就會(huì)大不相同,我們來(lái)看看查詢結(jié)果;
SELECT name as ’用戶名’,DATE_FORMAT(createTime,’%H’) as ’時(shí)間/小時(shí)’,count(*) as ’訂單量’ from t_order GROUP BY DATE_FORMAT(createTime,’%H’);
查詢結(jié)果
mysql> SELECT name as ’用戶名’,DATE_FORMAT(createTime,’%H’) as ’時(shí)間/小時(shí)’,count(*) as ’訂單量’ from t_order GROUP BY DATE_FORMAT(createTime,’%H’);+-----------------+---------------+-----------+| 用戶名 | 時(shí)間/小時(shí) | 訂單量 |+-----------------+---------------+-----------+| 觸手怪劉大莉 | 00 | 11 || 觸手怪劉大莉 | 01 | 302 || 觸手怪劉大莉 | 02 | 277 || 觸手怪劉大莉 | 03 | 122 || 觸手怪劉大莉 | 04 | 6 || 觸手怪劉大莉 | 05 | 11 || 觸手怪劉大莉 | 06 | 0 || 觸手怪劉大莉 | 07 | 0 || 觸手怪劉大莉 | 08 | 1 || 觸手怪劉大莉 | 09 | 4 || 觸手怪劉大莉 | 10 | 5 || 觸手怪劉大莉 | 11 | 92 || 觸手怪劉大莉 | 12 | 1937 || 觸手怪劉大莉 | 13 | 1602 || 觸手怪劉大莉 | 14 | 108 || 觸手怪劉大莉 | 15 | 78 || 觸手怪劉大莉 | 16 | 110 || 觸手怪劉大莉 | 17 | 108 || 觸手怪劉大莉 | 18 | 138 || 觸手怪劉大莉 | 19 | 66 || 觸手怪劉大莉 | 20 | 44 || 觸手怪劉大莉 | 21 | 59 || 觸手怪劉大莉 | 22 | 21 || 觸手怪劉大莉 | 23 | 8 |+-----------------+---------------+-----------+24 rows in set (0.01 sec)
通過(guò)查詢結(jié)果可以看出,查出的數(shù)據(jù)是用戶歷史所有的訂單數(shù)在各小時(shí)的分布情況,DATE_FORMAT(createTime,’%H’)代表的是是任意天的小時(shí),也等價(jià)于GROUP BY HOUR(createTime)。
拿到這些數(shù)據(jù),相信寫(xiě)推薦算法的同學(xué)就知道在哪個(gè)時(shí)間段給“觸手怪劉大莉”同學(xué)推廣告的效果最好了。
到此這篇關(guān)于MySQL的DATE_FORMAT函數(shù)的使用的文章就介紹到這了,更多相關(guān)MySQL DATE_FORMAT內(nèi)容請(qǐng)搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!
相關(guān)文章:
1. mysql數(shù)據(jù)庫(kù)中最常用的時(shí)間轉(zhuǎn)換函數(shù)的用法2. 在redhat 9 上安裝oracle 9.2.0.4 時(shí),DBCA 出錯(cuò)的解決辦法3. oracle觸發(fā)器介紹5. 快速刪除ORACLE重復(fù)記錄6. mysql like語(yǔ)句問(wèn)題7. Access數(shù)據(jù)庫(kù)安全的幾個(gè)問(wèn)題8. 數(shù)據(jù)庫(kù)Oracle9i的企業(yè)管理器簡(jiǎn)介9. 導(dǎo)出錯(cuò)誤編碼的mysql數(shù)據(jù)庫(kù)10. MySQL基本調(diào)度策略淺析
