一、datetime 格式數據提取
mysql 中已存在列格式為 datetime 格式時,提取其中的年:
季度: quarter
月:month
周 :week
日:day
時:hour
分:minute
秒:second
select year(a.`訂購日期`) from `訂單` a;
改變顯示格式方法:
1、格式化:
SELECT DATE_FORMAT(a.`訂購日期`,'%Y-%m') from `訂單` a;
2、字符串截取
select left(a.`訂購日期`,10) from `訂單` a;

二、mysql中關於date函數
向日期添加指定時間間隔函數
date_add(date,INTERVAL expr type)
向日期減去指定時間間隔函數
date_sub(date,INTERVAL expr type)
返回兩個日期之間的函數
datediff(date1,date2)
以不同的格式顯示時間
date_format(date,format)
三、查看連續登錄天數
這類問題,用窗口函數來解決更方便些,下面先列舉下常用的窗口函數
1、累計計算窗口函數
sum、avg、max、min
sum(...A...) over (partition by...B... order by ...C... rows between....D1...and...D2...)
partition by 分組字段
order by 按什么字段排序
rows...between 計算的行數范圍 移動求平均值常用
2、分區排序窗口函數
row_number() over (partition by...B... order by ...C...) 1 2 3 4 5
rank() over (partition by...B... order by ...C...) 1 1 1 4 5
dense_rank() over (partition by...B... order by ...C...) 1 1 1 2 3
3、分組排序
ntile() 不支持分組排序 rows ..between ...
ntile() over (partition by...B... order by ...C...) 前 10%的用戶
4、偏移分析窗口函數
應用場景 :解決今天和昨天的數據差
前offset 行數據
lag(exp_str,offset,defval) over (partition by...B... order by ...C...)
后offset 行數據
lead(exp_str,offset,defval) over (partition by...B... order by ...C...)
舉個例子
創建表,字段有 id,long_time
create table user_login(user_id int,login_time date);
插入數據
insert into user_login values
(1,'2019-06-01'),
(1,'2019-06-02'),
(1,'2019-06-03'),
(1,'2019-06-06'),
(1,'2019-06-07'),
(1,'2019-06-08'),
(1,'2019-06-11'),
(1,'2019-06-12'),
(2,'2019-06-01'),
(2,'2019-06-02'),
(2,'2019-06-04'),
(3,'2019-06-01'),
(3,'2019-06-02'),
(4,'2019-06-01'),
(5,'2019-06-01'),
(5,'2019-06-02');
1、顯示出每個用戶連續登錄天數,不去重用戶
1、對原表增加分區排序窗口函數 row_number,按序號分組,時間排序
2、用date_sub()函數,登錄日期減去序號,如果是連續登錄日期,那么date_sub()函數結果就會一致
3、最后,將數據結果按id 和 date_sub()函數分組
SELECT user_id,
date_sub(login_time, INTERVAL rn DAY) AS login_group, -- 連續登錄數據會一致
min(login_time) AS start_login_time,
max(login_time) AS end_login_time,
count(login_time) AS continuous_days
FROM
(SELECT user_id,login_time,
row_number () over (PARTITION BY user_id ORDER BY login_time) AS rn 分區排序窗口函數,分組、排序
FROM
user_login) t
GROUP BY user_id, date_sub(login_time, INTERVAL rn DAY);/2、
2、計算連續出現n次數據問題

成績連續出現三次
解題思路 :
1、偏移分析窗口函數,將成績向上偏移兩位
2、計算score列與偏移后成績的差值,0值即連續的成績
SELECT id,score,(score - lead_score) as score3 from
(select id,score,lead(score,2) over (order by id) as lead_score from score order by id) a
WHERE (score - lead_score)=0;
