国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【實用】Mysql 按照時間(年月周日)維度統(tǒng)計,不存在時間數(shù)據 自動補充 0 數(shù)值

這篇具有很好參考價值的文章主要介紹了【實用】Mysql 按照時間(年月周日)維度統(tǒng)計,不存在時間數(shù)據 自動補充 0 數(shù)值。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

前言


ps: 網上看了一大堆文章, 介紹的東西真的是很夠嗆, 就沒一個能真正用起來的, 各個都是自動補,然后很多都是不好用的。

我自己整理一篇,這是真能用。

本篇內容 :

① 按照 日 、周、月 、年 ?的維度 去對數(shù)據 做分組統(tǒng)計?

② 不存在的數(shù)據自動補充 0 ?(實用)

正文

不多說,開搞。


結合實例 :

先看我們的表 student?

sql按照年月日分組 并將沒有的日期補齊 數(shù)值填0,MySQL,mysql,數(shù)據庫,補0,日期分組,統(tǒng)計

?建表sql:

CREATE TABLE `student` (
?? ?`id` INT(11) NOT NULL AUTO_INCREMENT COMMENT 'id',
?? ?`name` VARCHAR(50) NULL DEFAULT NULL COMMENT '名字' COLLATE 'utf8_general_ci',
?? ?`admission_time` DATETIME NULL DEFAULT NULL COMMENT '入學時間',
?? ?PRIMARY KEY (`id`) USING BTREE
)


現(xiàn)在我們就舉個簡單的業(yè)務場景:

根據admission_time 入學時間,按照年月日周這些維度?去統(tǒng)計 學生數(shù)量。


我們來做一些模擬數(shù)據,8條數(shù)據:

sql按照年月日分組 并將沒有的日期補齊 數(shù)值填0,MySQL,mysql,數(shù)據庫,補0,日期分組,統(tǒng)計

第一部分 , 按照時間維度統(tǒng)計的SQL 寫法


我們先簡單看看 按照 日 、周 ?、月 、年 的統(tǒng)計 sql怎么寫 :


日 維度?

sql:

SELECT date_format(admission_time, '%Y-%m-%d') date_time, COUNT(*) num
FROM student
GROUP BY date_time ;

?看看效果:


sql按照年月日分組 并將沒有的日期補齊 數(shù)值填0,MySQL,mysql,數(shù)據庫,補0,日期分組,統(tǒng)計

?
ps : 注意了 這些 ‘-’ 是我們定義的格式, 我們不要 ‘-’ 換成其他的也是可以的,但是 不能不要 ymd 這些關鍵字。

舉個小栗子:
?
?
比如 ,date_format(admission_time, '收藏%Y點%m贊%d')

SELECT date_format(admission_time, '收藏%Y點%m贊%d') date_time, COUNT(*) num
FROM student
GROUP BY date_time ;

看看效果 :

sql按照年月日分組 并將沒有的日期補齊 數(shù)值填0,MySQL,mysql,數(shù)據庫,補0,日期分組,統(tǒng)計

周維度?

?sql:

SELECT DATE_FORMAT(admission_time,'%Y-%u 周') ?AS ?date_time, COUNT(*) num FROM student GROUP BY date_time;

ps : 為了讓你們知道 這個周的概念, 我故意加了個中文。 而且特意把一條數(shù)據 時間改成 22年的最后一周的一天。

sql按照年月日分組 并將沒有的日期補齊 數(shù)值填0,MySQL,mysql,數(shù)據庫,補0,日期分組,統(tǒng)計

?
看看效果 :

sql按照年月日分組 并將沒有的日期補齊 數(shù)值填0,MySQL,mysql,數(shù)據庫,補0,日期分組,統(tǒng)計


月維度?

sql:

SELECT DATE_FORMAT(admission_time, '%Y-%m') date_time, COUNT(*) num
FROM student
GROUP BY date_time ;

看看效果 :

sql按照年月日分組 并將沒有的日期補齊 數(shù)值填0,MySQL,mysql,數(shù)據庫,補0,日期分組,統(tǒng)計

年維度

sql:

SELECT DATE_FORMAT(admission_time, '%Y') date_time, COUNT(*) num
FROM student
GROUP BY date_time ;

看看效果:

sql按照年月日分組 并將沒有的日期補齊 數(shù)值填0,MySQL,mysql,數(shù)據庫,補0,日期分組,統(tǒng)計

好了 知道這些基礎的 時間分組sql 用法之后, 那么我們接下來就 來 玩下怎么 解決自動補 0 的這個問題。


第二部分 , 自動填充不存在的數(shù)據 數(shù)值 0


首先,如果說 sql查出來的數(shù)據沒有, 我們拿月維度的來 做個示例 ,就像這樣 :

sql按照年月日分組 并將沒有的日期補齊 數(shù)值填0,MySQL,mysql,數(shù)據庫,補0,日期分組,統(tǒng)計?

這里突然想到個點,很多人說那這里面混了 2022年, 2023年的數(shù)據, 我想要指定查詢某段時間的怎么搞?

其實一樣的,就根據時間查詢就行:

比如像這樣傳入我們的篩選時間范圍,按照月就這樣 :

sql:


SELECT * FROM (

select date_format(admission_time, '%Y-%m') date_time, count(*) num
from student
group by date_format(admission_time, '%Y-%m')

)t WHERE t.date_time BETWEEN '2023-01' AND ? '2023-03'

效果:


sql按照年月日分組 并將沒有的日期補齊 數(shù)值填0,MySQL,mysql,數(shù)據庫,補0,日期分組,統(tǒng)計

?
回到剛才,可以看到統(tǒng)計出來的數(shù)據, 比如說23年的,有1月的,2月的, 3月的, 那么 4,5,6,7后面這些月份,沒數(shù)據,那怎么辦?

如何默認去填充 0呢 ?
?

寫代碼填充,后端拿到查數(shù)據庫返回的數(shù)據,for循環(huán)遍歷,檢測時間段內的日期, 比如說 12個月,看看哪個月沒有,就填充。

確實 這是可以的, 但是今天這一篇介紹的是通過sql返回 , 不考慮代碼上面的填補。

接下來看看SQL怎么玩 。

思路&想法?:?
?

我們能查出來 student 現(xiàn)有的日期數(shù)據, 那么缺少的數(shù)據 我也得給整出來 。

那我們肯定不能去改 student表的數(shù)據呀, 現(xiàn)在就是單純少了一些 空白月份的數(shù)據 。


所以我們選擇 臨時數(shù)據表的思維。


ps : 網上一大堆文章,都讓咱們去跑個存儲過程 ?強行生成一個表..

你看看(一萬個拒絕)?

sql按照年月日分組 并將沒有的日期補齊 數(shù)值填0,MySQL,mysql,數(shù)據庫,補0,日期分組,統(tǒng)計

?還有這種,按照目前時間拼接出來的:

(5000個拒絕,這種now 直接切割到現(xiàn)在,還得寫一大堆這種01,02,03,04;
? ?如果我是要填充 日維度的數(shù)據,那我這sql代碼量不就爆炸了?

)?
sql按照年月日分組 并將沒有的日期補齊 數(shù)值填0,MySQL,mysql,數(shù)據庫,補0,日期分組,統(tǒng)計

?這種也是:
sql按照年月日分組 并將沒有的日期補齊 數(shù)值填0,MySQL,mysql,數(shù)據庫,補0,日期分組,統(tǒng)計

OK, 我們來看看我們的SQL :

?

select DATE_FORMAT(date_add('2023-01-01', interval row MONTH),'%Y-%m') date_time from
 ( 
    SELECT @row := @row + 1 as row FROM 
    (select 0 union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) t,
    (select 0 union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) t2, 
    (SELECT @row:=-1) r
 ) se
 where DATE_FORMAT(date_add('2023-01-01', interval row MONTH),'%Y-%m') <= DATE_FORMAT('2023-12-01','%Y-%m')

效果 :
?

sql按照年月日分組 并將沒有的日期補齊 數(shù)值填0,MySQL,mysql,數(shù)據庫,補0,日期分組,統(tǒng)計

ps: 這里用了月舉例, 要弄年或周或者日的 在文末有補充。

sql 作用簡析 :

簡析點一?


sql按照年月日分組 并將沒有的日期補齊 數(shù)值填0,MySQL,mysql,數(shù)據庫,補0,日期分組,統(tǒng)計
?

?簡析點二

sql按照年月日分組 并將沒有的日期補齊 數(shù)值填0,MySQL,mysql,數(shù)據庫,補0,日期分組,統(tǒng)計

?可以看到 ,這里面 我寫了2行這個玩意??。

(select 0 union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) t
?

簡單說下:
?

寫一行這個玩意, 代表能搞出?10 條 符合 范圍時間內日期格式時間數(shù)據?;

當寫多一行呢(2行的時候),代表 10 * 10 =100 條?

當再寫多一行呢(3行的時候)?? 10*10*10 =1000條

所以我們上面的sql,我寫了2行,

代表 在我傳入的時間范圍 2023-01-01 到 2323-12-01? 內

我寫的時間格式是取月, 一共其實就12 個月數(shù)據,也就是12條, 但是只寫一次10條不夠用,我也就用了2次(100條)。

言下之意, 其實你跟我這樣寫2次,100條, 什么概念, 1年12個月 相當于12條,這樣 100條相當于可以查跨度 8年的時間了 (8*12-96)

如果你不是要查日, 業(yè)務需求一般不會讓咱們寫跨度這么大的。

當然了,如果就是有, 那么我們大不了直接寫 4條, 相當于 10*10*10*10 =1 萬??條。

sql按照年月日分組 并將沒有的日期補齊 數(shù)值填0,MySQL,mysql,數(shù)據庫,補0,日期分組,統(tǒng)計

OK,不啰嗦,回到我們的示例 :

我們現(xiàn)在 如果說是查跨度 2年的數(shù)據, 比如現(xiàn)在按照我們part的sql 查出來是這樣子的 。

sql按照年月日分組 并將沒有的日期補齊 數(shù)值填0,MySQL,mysql,數(shù)據庫,補0,日期分組,統(tǒng)計

可以看到結果集, 22年數(shù)據 缺了很多 需要補0的, 23年也缺了很多。

所以我們這時候需要做一個 left join 即可解決自動補 0 的事情。

sql按照年月日分組 并將沒有的日期補齊 數(shù)值填0,MySQL,mysql,數(shù)據庫,補0,日期分組,統(tǒng)計

sql操作圖析:
?

sql按照年月日分組 并將沒有的日期補齊 數(shù)值填0,MySQL,mysql,數(shù)據庫,補0,日期分組,統(tǒng)計

sql:


SELECT  A.date_time, COALESCE(B.num, 0) as num  FROM 


(

SELECT DATE_FORMAT(date_add('2023-01-01', interval row MONTH),'%Y-%m') date_time FROM
 ( 
    SELECT @row := @row + 1 as row FROM 
    (select 0 union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) t,
    (select 0 union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) t2,
	 (select 0 union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) t3,
	 (select 0 union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) t4,
	  
    (SELECT @row:=-1) r
 ) se
WHERE DATE_FORMAT(date_add('2023-01-01', interval row MONTH),'%Y-%m') <= DATE_FORMAT('2023-12-01','%Y-%m')

) A


LEFT JOIN 

(

SELECT DATE_FORMAT(admission_time, '%Y-%m') date_time, COUNT(*) num
FROM student
GROUP BY DATE_FORMAT(admission_time, '%Y-%m')

) B


ON    A.date_time= B.date_time

看看效果 :

sql按照年月日分組 并將沒有的日期補齊 數(shù)值填0,MySQL,mysql,數(shù)據庫,補0,日期分組,統(tǒng)計

sql按照年月日分組 并將沒有的日期補齊 數(shù)值填0,MySQL,mysql,數(shù)據庫,補0,日期分組,統(tǒng)計

這盛世如我所愿, 好了, 該篇就到這。?

文末補充 日、年、周 維度的 列出完整數(shù)據條sql :

按日 列出范圍內日期的sql :
?

select date_add('2023-01-01', interval row DAY) date from
 ( 
    SELECT @row := @row + 1 as row FROM 
    (select 0 union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) t,
    (select 0 union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) t2,
	  (select 0 union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) t3,
	   (select 0 union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) t4,   
    (SELECT @row:=-1) r
 ) se
 where date_add('2023-01-01', interval row DAY) <= '2023-01-20'

?效果:

sql按照年月日分組 并將沒有的日期補齊 數(shù)值填0,MySQL,mysql,數(shù)據庫,補0,日期分組,統(tǒng)計

按周 列出范圍內日期的sql :

按照周要注意一點,當傳入每年的01-01這一天的時候?會出現(xiàn)0周 ,可以做一下處理。

 select DATE_FORMAT(date_add('2023-01-01', interval row WEEK),'%Y-%u') date_time from
 ( 
    SELECT @row := @row + 1 as row FROM 
    (select 0 union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) t,
    (select 0 union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) t2,
	 (select 0 union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) t3,
	 (select 0 union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) t4,
	  
    (SELECT @row:=-1) r
 ) se
 where DATE_FORMAT(date_add('2023-01-01', interval row WEEK),'%Y-%u') <= DATE_FORMAT('2023-01-06','%Y-%u')

按年?列出范圍內日期的sql :


select DATE_FORMAT(date_add('2020-01-01', interval row YEAR),'%Y') date_time from
 ( 
    SELECT @row := @row + 1 as row FROM 
    (select 0 union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) t,
    (select 0 union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) t2,
	 (select 0 union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) t3,
	 (select 0 union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) t4,
	  
    (SELECT @row:=-1) r
 ) se
 where DATE_FORMAT(date_add('2020-01-01', interval row YEAR),'%Y') <= DATE_FORMAT('2023-12-01','%Y')
 

效果:
sql按照年月日分組 并將沒有的日期補齊 數(shù)值填0,MySQL,mysql,數(shù)據庫,補0,日期分組,統(tǒng)計文章來源地址http://www.zghlxwxcb.cn/news/detail-775072.html

到了這里,關于【實用】Mysql 按照時間(年月周日)維度統(tǒng)計,不存在時間數(shù)據 自動補充 0 數(shù)值的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!

本文來自互聯(lián)網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉載,請注明出處: 如若內容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • MySQL場景分析--按照班級查詢,并統(tǒng)計各班級男、女的人數(shù)和總人數(shù)

    MySQL場景分析--按照班級查詢,并統(tǒng)計各班級男、女的人數(shù)和總人數(shù)

    現(xiàn)在有一張學生表,字段如下。請按照班級查詢,并統(tǒng)計各班級男、女的人數(shù)和總人數(shù)。 Group by SQL GROUP BY 子句用來根據指定的字段對結果集(選取的數(shù)據)進行分組,如果某些記錄的指定字段具有相同的值,那么它們將被合并為一條數(shù)據。 通俗地理解,GROUP BY 子句將根據指

    2024年02月05日
    瀏覽(19)
  • Java獲取指定時間一周至周日的日期

    Java獲取指定時間一周至周日的日期

    ?Java獲取指定時間一周至周日的日期: 測試類: 輸出: ?

    2024年02月13日
    瀏覽(23)
  • MySQL時間分組:按小時統(tǒng)計數(shù)據(mysql按小時分組)

    MySQL時間分組是一類涉及MySQL數(shù)據庫的SQL語句,能夠以小時對數(shù)據進行分組統(tǒng)計。 比如,如果你想根據一定的時間間隔,把MySQL數(shù)據庫中的記錄分成幾組,那么MySQL時間分組技術就派上用場了。 MySQL時間分組主要使用MySQL語句YEAR(), WEEK(), HOUR()和GROUP BY來實現(xiàn),按小時統(tǒng)計數(shù)據實

    2024年02月12日
    瀏覽(22)
  • mysql統(tǒng)計近7天數(shù)據量,,按時間戳分組

    mysql統(tǒng)計近7天數(shù)據量,,按時間戳分組

    可以使用以下 SQL 語句來統(tǒng)計近7天的數(shù)據量,并按時間戳分組。如果某一天沒有數(shù)據,則將其填充為0。 解釋說明: DATE_FORMAT(FROM_UNIXTIME( timestamp ), \\\'%Y-%m-%d\\\') AS date 將時間戳轉換為日期格式,例如 2021-03-01。 COUNT(*) AS count 統(tǒng)計每天數(shù)據的數(shù)量。 WHERE timestamp = UNIX_TIMESTAMP(DATE_SUB

    2024年02月13日
    瀏覽(27)
  • mysql 近一年、近一月、昨日、近一周等時間統(tǒng)計

    mysql 近一年、近一月、昨日、近一周等時間統(tǒng)計

    在此基礎上,有部分業(yè)務場景需要符合一些統(tǒng)計圖形進行展示: 一、統(tǒng)計近一年每個月的數(shù)據 二、統(tǒng)計近一月30天的數(shù)據 ps:course_date表可以試任意一個表,但是前提表的數(shù)據量必須大于查詢的天數(shù)跨度 三、當天按照小時展示 僅用于自己學習參考,如有錯誤,可提醒修改。

    2024年02月11日
    瀏覽(23)
  • elementUI moment 年月日轉時間戳 時間限制
  • 獲取兩個時間段之間的年月

    ?//獲取兩個時間段之間的年月 ? ? ? ? getMonthBetween(start,end){ ? ? ? ? ? ? ? var result = []; ? ? ? ? ? ? ? var s = start.split(\\\"-\\\"); ? ? ? ? ? ? ? var e = end.split(\\\"-\\\"); ? ? ? ? ? ? ? var min = new Date(); ? ? ? ? ? ? ? var max = new Date(); ? ? ? ? ? ? ? min.setFullYear(s[0],s[1]); ? ? ? ? ?

    2024年03月21日
    瀏覽(22)
  • 如何將時間戳轉化為年月日時分秒格式

    首先獲取到當前的時間戳或者需要轉化為時間的時間戳 然后使用getFullYear、getMonth、 getDate、getHours、getMinutes、getSeconds等方法來獲取當前時間的年月日時分秒 最后使用字符串拼接的方式得到我們想要的時間 如果往后端傳時間有嚴格要求必須是0000-00-00 00:00:00這種格式再做處理

    2024年02月15日
    瀏覽(81)
  • SQL Server ,日期時間函數(shù)將時間日期類型的值截取為年月日

    使用 CONVERT 函數(shù)將日期時間類型的值轉換為字符串類型,同時指定格式為 yyyyMMdd(例如2022年6月30日的日期字符串為\\\'20220630\\\')。 sql復制代碼 在上述例子中,我們使用 GETDATE 函數(shù)獲取當前的日期時間,然后使用 CONVERT 函數(shù)將其轉換為格式為 yyyyMMdd 的字符串類型。 如果要將日期

    2024年02月16日
    瀏覽(30)
  • javascript設置指定年月日,js動態(tài)顯示當前時間

    javascript設置指定年月日,js動態(tài)顯示當前時間

    大家好,本文將圍繞js中如何動態(tài)顯示日期時間展開說明,javascript設置指定年月日是一個很多人都想弄明白的事情,想搞清楚js動態(tài)顯示當前時間需要先了解以下幾個事情。 創(chuàng)建showTime()函數(shù),利用JavaScript中的Date對象的屬性及方法獲取時間,利用Window對象的 setInterval() 方法按

    2024年02月03日
    瀏覽(865)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包