Mysql gets the dates of the last 7 days, 7 weeks, July, and 7 years, and even the current time Gets the dates of the last 7 days, 7 weeks, July, and 7 years. Without further ado, just look at Figure 1: get according to the maximum time in
the
table Last 7 days date
SELECT
DATE_FORMAT(creattime, "%Y-%m-%d") b
FROM t_stock_realtime_inventory
WHERE
DATE_FORMAT(creattime, "%Y-%m-%d") > (
SELECT DATE_FORMAT(DATE_SUB((SELECT MAX(creattime) FROM t_stock_realtime_inventory), INTERVAL 7 DAY ),
"%Y-%m-%d") a
GROUP BY a )
GROUP BY
b
ORDER BY
b ASC
1.1 Obtain the date of the last 7 days according to the current time
SELECT
date_sub( curdate( ), INTERVAL 7 DAY ) AS a UNION
SELECT
date_sub( curdate( ), INTERVAL 6 DAY ) AS a UNION
SELECT
date_sub( curdate( ), INTERVAL 5 DAY ) AS a UNION
SELECT
date_sub( curdate( ), INTERVAL 4 DAY ) AS a UNION
SELECT
date_sub( curdate( ), INTERVAL 3 DAY ) AS a UNION
SELECT
date_sub( curdate( ), INTERVAL 2 DAY ) AS a UNION
SELECT
date_sub( curdate( ), INTERVAL 1 DAY ) AS a
FROM DUAL
2. Get the date of the last 7 weeks according to the maximum time in the table
SELECT WEEK(creattime, 1) a
FROM t_stock_realtime_inventory
WHERE WEEK(creattime, 1) > (SELECT WEEK((SELECT MAX(creattime) FROM t_stock_realtime_inventory), 1)) - 7
GROUP BY a
ORDER BY a ASC
2.1 Obtain the date of the last 7 weeks according to the current time
SELECT
week(date_sub( curdate( ), INTERVAL 6 week ),1) AS a UNION
SELECT
week(date_sub( curdate( ), INTERVAL 5 week ),1) AS a UNION
SELECT
week(date_sub( curdate( ), INTERVAL 4 week),1) AS a UNION
SELECT
week(date_sub( curdate( ), INTERVAL 3 week ),1) AS a UNION
SELECT
WEEK(date_sub( curdate( ), INTERVAL 2 week ),1) AS a UNION
SELECT
week(date_sub( curdate( ), INTERVAL 1 week ),1) AS a UNION
SELECT
week( curdate( ), 1) AS a FROM DUAL
2.2 Get nearly 7 weeks, every week data
SELECT
D.dict_label lspzmc,
D.dict_value lspzid,
CASE WHEN T.ccl IS NULL THEN 0 ELSE ROUND( SUM( T.CCL ), 4 ) END ccl
FROM
sys_dict_data D
LEFT JOIN (
SELECT
b.dic_desc lspzmc,
WEEK ( creat_time, 1 ) creat_time,
CASE WHEN sum( t.storage_qty ) IS NULL THEN 0 ELSE sum( t.storage_qty ) END ccl
FROM
`t_stock_history` t
INNER JOIN t_sys_dic b ON t.foodstuff_varieties_id = b.dic_id
WHERE
DATE_SUB( CURDATE( ), INTERVAL 49 DAY ) <= DATE( t.creat_time ) -- 近7周内的数据故为 49
AND WEEK ( creat_time, 1 ) = 17 -- 等于多少周
GROUP BY
b.dic_desc,
creat_time
ORDER BY
ccl DESC
) T ON T.lspzmc = D.dict_label
WHERE
dict_type = 'lslx'
GROUP BY
D.dict_label,
D.dict_value
3. Get the date of the last July according to the maximum time in the table
SELECT
DATE_FORMAT(creattime, "%Y-%m") b
FROM t_stock_realtime_inventory
WHERE
DATE_FORMAT(creattime, "%Y-%m") > (
SELECT DATE_FORMAT(DATE_SUB((SELECT MAX(creattime) FROM t_stock_realtime_inventory), INTERVAL 7 MONTH ),
"%Y-%m") a
GROUP BY a )
GROUP BY
b
ORDER BY
b ASC
3.1 Obtain the latest July date according to the current time
SELECT DATE_FORMAT(DATE_SUB(NOW(),INTERVAL 6 month),"%Y-%m") UNION
SELECT DATE_FORMAT(DATE_SUB(NOW(),INTERVAL 5 month),"%Y-%m") UNION
SELECT DATE_FORMAT(DATE_SUB(NOW(),INTERVAL 4 month),"%Y-%m") UNION
SELECT DATE_FORMAT(DATE_SUB(NOW(),INTERVAL 3 month),"%Y-%m") UNION
SELECT DATE_FORMAT(DATE_SUB(NOW(),INTERVAL 2 month),"%Y-%m") UNION
SELECT DATE_FORMAT(DATE_SUB(NOW(),INTERVAL 1 month),"%Y-%m") UNION
select DATE_FORMAT(NOW(),"%Y-%m") FROM DUAL
4. Obtain the date of the last 7 years according to the maximum time in the table
SELECT DATE_FORMAT(creattime, "%Y") b
FROM t_stock_realtime_inventory
WHERE DATE_FORMAT(creattime, "%Y") > (
SELECT DATE_FORMAT(DATE_SUB((SELECT MAX(creattime) FROM t_stock_realtime_inventory), INTERVAL 7 YEAR ), "%Y") a
GROUP BY a )
GROUP BY
b
ORDER BY
b ASC
4.1 Obtain the date of the last 7 years according to the current time
SELECT DATE_FORMAT(DATE_SUB(NOW(),INTERVAL 6 YEAR),"%Y") UNION
SELECT DATE_FORMAT(DATE_SUB(NOW(),INTERVAL 5 YEAR),"%Y") UNION
SELECT DATE_FORMAT(DATE_SUB(NOW(),INTERVAL 4 YEAR),"%Y") UNION
SELECT DATE_FORMAT(DATE_SUB(NOW(),INTERVAL 3 YEAR),"%Y") UNION
SELECT DATE_FORMAT(DATE_SUB(NOW(),INTERVAL 2 YEAR),"%Y") UNION
SELECT DATE_FORMAT(DATE_SUB(NOW(),INTERVAL 1 YEAR),"%Y") UNION
select DATE_FORMAT(NOW(),"%Y") FROM DUAL
For reference, you can modify the parameter query according to your own business logic
5. Get the date of the last day of each month in recent months
SELECT date_format(dateadd(ms,-3,DATEADD(mm, DATEDIFF(m,0,getdate())-10, 0)),'yyyy-MM-dd')
union all
SELECT date_format(dateadd(ms,-3,DATEADD(mm, DATEDIFF(m,0,getdate())-9, 0)),'yyyy-MM-dd')
union all
SELECT date_format(dateadd(ms,-3,DATEADD(mm, DATEDIFF(m,0,getdate())-8, 0)),'yyyy-MM-dd')
union all
SELECT date_format(dateadd(ms,-3,DATEADD(mm, DATEDIFF(m,0,getdate())-7, 0)),'yyyy-MM-dd')
union all
SELECT date_format(dateadd(ms,-3,DATEADD(mm, DATEDIFF(m,0,getdate())-6, 0)),'yyyy-MM-dd')
union all
SELECT date_format(dateadd(ms,-3,DATEADD(mm, DATEDIFF(m,0,getdate())-5, 0)),'yyyy-MM-dd')
union all
SELECT date_format(dateadd(ms,-3,DATEADD(mm, DATEDIFF(m,0,getdate())-4, 0)),'yyyy-MM-dd')
union all
SELECT date_format(dateadd(ms,-3,DATEADD(mm, DATEDIFF(m,0,getdate())-3, 0)),'yyyy-MM-dd')
union all
SELECT date_format(dateadd(ms,-3,DATEADD(mm, DATEDIFF(m,0,getdate())-2, 0)),'yyyy-MM-dd')
union all
SELECT date_format(dateadd(ms,-3,DATEADD(mm, DATEDIFF(m,0,getdate())-2, 0)),'yyyy-MM-dd')
union all
SELECT date_format(dateadd(ms,-3,DATEADD(mm, DATEDIFF(m,0,getdate()), 0)),'yyyy-MM-dd')
union all
select date_format(now(),'yyyy-MM-dd')