msyql 腳本處理兩個日期之前的月份列表記錄和日期列表記錄
需求:最近有個需求,需要安時間區(qū)間統(tǒng)計一張表中的數(shù)據(jù),按月份和日期統(tǒng)計,問題是,有的月份和日期可能都沒有數(shù)據(jù),但是也要統(tǒng)計出來數(shù)據(jù),還要跟去年同期對比。
- 我第一反應(yīng)就是用日期左聯(lián)查詢,因為sqlserver 有系統(tǒng)函數(shù)支持查詢?nèi)掌谟涗浐驮路萦涗?,后來找了下,發(fā)現(xiàn)mysql 沒有找到,蛋疼。
- 有同事說建個表來存儲日期記錄,嗯嗯,不太喜歡,雖然用過這種方案,因為又是動態(tài)的我覺得,我覺得還是要單獨處理,我直接pass 。
- 有的說代碼生成 pass
后面左百度,又百度,然后又理解一些mysql的函數(shù),都沒有找到合適的,后么在網(wǎng)上大體符合我的需求的,然后自己稍微改了下,OK搞定
- 主要函數(shù)
```mysql
DATE_FORMAT('日期','') 函數(shù)用于以不同的格式顯示日期/時間數(shù)據(jù)。
DATE_SUB(date,INTERVAL expr type)
date 日期
expr 數(shù)字
type YEAR,MONTH,DAY
函數(shù)從日期減去指定的時間間隔。
SELECT UNION 其實就是模擬自己想要的數(shù)字?jǐn)?shù)據(jù) ,構(gòu)建成一個表
where d <= 5 只獲取1-5的數(shù)據(jù)
```
- 月份 可以直接執(zhí)行
```mysql
SELECT DATE_FORMAT(DATE_SUB('2018-09-09', INTERVAL d MONTH), '%Y-%m') as year_month_day
FROM (
select d from (
SELECT @xi:=@xi+1 as d from
(SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5) xc1,
(SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5) xc2,
(SELECT @xi:=-1) xc0
) as m where d <= 5
) dtc
```
- 日期 可以直接執(zhí)行
SELECT DATE_FORMAT(DATE_SUB('2018-09-09', INTERVAL d DAY), '%Y-%m-%d') as year_month_day
FROM (
select d from (
SELECT @xi:=@xi+1 as d from
(SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5) xc1,
(SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5) xc2,
(SELECT @xi:=-1) xc0
) as m where d <= 5
) dtc
```