翼度科技»论坛 编程开发 mysql 查看内容

MySQL中使用CTE获取时间段数据的技巧分享

4

主题

4

帖子

12

积分

新手上路

Rank: 1

积分
12
引言

在数据库操作中,获取特定时间段的数据是一项常见任务。MySQL自从8.0版本开始支持CTE(公共表表达式),使得我们可以更加灵活和高效地处理时间段数据。本文将介绍如何使用CTE获取最近十二个月、最近十二周、最近四个季度,以及如何获取十二个月前的月第一天和十二周前的周第一天。

1. 获取最近十二个月

当你需要获取最近十二个月的月份数据时,CTE可以帮助你生成一个包含这些月份的列表。
  1. WITH RECURSIVE month_12 AS (
  2.     SELECT CURDATE() AS date_day
  3.     UNION ALL
  4.     SELECT DATE_SUB(date_day, INTERVAL 1 MONTH)
  5.     FROM month_12
  6.     WHERE date_day > DATE_SUB(CURDATE(), INTERVAL 11 MONTH)
  7. ),
  8. mon_12 AS (
  9. SELECT DATE_FORMAT(date_day, '%Y-%m') AS label FROM  month_12 ORDER BY date_day desc
  10. )

  11. select * from mon_12
复制代码




解释:


  • 通过
    1. DATE_FORMAT(CURDATE(), '%Y-%m')
    复制代码
    获取当前的年份和月份。
  • 使用递归的方式生成从当前月往前推的十二个月。
  • 最后,按年份和月份倒序排列,以确保最近的月份排在前面。

2. 获取最近十二周

如果你需要获取最近十二周的周数据,CTE也可以帮助你生成一个列表,其中每个条目表示一个特定的周。
  1. WITH RECURSIVE week_date_12 AS (
  2.     SELECT CURDATE() AS date_day
  3.     UNION ALL
  4.     SELECT DATE_SUB(date_day, INTERVAL 1 week)
  5.     FROM week_date_12
  6.     WHERE date_day > DATE_SUB(CURDATE(), INTERVAL 11 week)
  7. ),
  8. week_12 AS (
  9. SELECT DATE_FORMAT(date_day, '%Y-%u') AS label FROM  week_date_12 ORDER BY date_day desc
  10. )
  11. SELECT label
  12. FROM week_12
复制代码
解释:


  • 通过
    1. YEARWEEK(CURDATE(), 3)
    复制代码
    获取当前日期所在的年份和周数。
  • 递归地从当前周开始,往前推十二周。
  • 结果按年份和周数倒序排列,显示最近的十二周。

3. 获取最近四个季度

对于季度数据的处理,MySQL中的CTE可以帮助你生成最近四个季度的列表。
  1. WITH RECURSIVE last_four_quarters AS (
  2.     SELECT
  3.         YEAR(CURDATE()) AS year,
  4.         QUARTER(CURDATE()) AS quarter
  5.     UNION ALL
  6.     SELECT
  7.         CASE
  8.             WHEN quarter = 1 THEN year - 1
  9.             ELSE year
  10.         END,
  11.         CASE
  12.             WHEN quarter = 1 THEN 4
  13.             ELSE quarter - 1
  14.         END
  15.     FROM last_four_quarters
  16.     WHERE year > YEAR(DATE_SUB(CURDATE(), INTERVAL 1 YEAR)) OR quarter > QUARTER(DATE_SUB(CURDATE(), INTERVAL 1 YEAR))
  17. )
  18. SELECT CONCAT(year, '-Q', quarter) AS year_quarter
  19. FROM last_four_quarters
  20. ORDER BY year DESC, quarter DESC;
复制代码
解释:


  • 使用
    1. YEAR(CURDATE())
    复制代码
    1. QUARTER(CURDATE())
    复制代码
    获取当前的年份和季度。
  • 递归生成最近四个季度的数据,确保季度的转换是正确的(例如,从第一季度到上一年的第四季度)。
  • 最终结果按年份和季度倒序排列。

4. 获取十二个月前的月第一天

当你需要获取十二个月前的月份的第一天,可以使用以下查询:
  1. SELECT DATE_FORMAT(DATE_SUB(CURDATE(), INTERVAL 12 MONTH), '%Y-%m-01') AS first_day_of_month;
复制代码
解释:


  • 使用
    1. DATE_SUB(CURDATE(), INTERVAL 12 MONTH)
    复制代码
    来获取十二个月前的日期。
  • 通过
    1. DATE_FORMAT(..., '%Y-%m-01')
    复制代码
    将这个日期格式化为该月份的第一天。
  1. select LAST_DAY(DATE_SUB(CURDATE(), INTERVAL 11 MONTH) - INTERVAL 1 MONTH) + INTERVAL 1 DAY
复制代码
5. 获取十二周前的周第一天

要获取十二周前的周第一天(通常是周一),可以使用以下查询:
  1. SELECT DATE_SUB(DATE_SUB(CURDATE(), INTERVAL 12 WEEK), INTERVAL WEEKDAY(DATE_SUB(CURDATE(), INTERVAL 12 WEEK)) DAY) AS first_day_of_week;
复制代码
解释:


    1. DATE_SUB(CURDATE(), INTERVAL 12 WEEK)
    复制代码
    计算十二周前的日期。
  • 使用
    1. WEEKDAY()
    复制代码
    函数计算该日期对应的周几(0表示周一,6表示周日)。
  • 最后通过减去这个天数,得到十二周前的周一。

结论

MySQL中的CTE为我们提供了强大的工具来处理复杂的时间段计算。通过使用CTE,你可以轻松地生成最近十二个月、十二周、四个季度的数据,还可以精确地获取特定时间段的第一天。掌握这些技巧,可以让你的时间管理和数据处理更加高效、精确,为你的数据库操作带来更大的灵活性和可控性。
以上就是MySQL中使用CTE获取时间段数据的技巧分享的详细内容,更多关于MySQL CTE获取时间段数据的资料请关注脚本之家其它相关文章!

来源:https://www.jb51.net/database/326279qbj.htm
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!
来自手机

举报 回复 使用道具