一、获取当前年月
MySQL提供了多种方式获取当前年月。在使用之前,需要确认MySQL的时区已正确设置。以下是常用的获取当前年月的方法。
-- 方法1:使用MONTH函数和YEAR函数
SELECT YEAR(NOW()), MONTH(NOW());
-- 方法2:使用DATE_FORMAT函数
SELECT DATE_FORMAT(NOW(), '%Y-%m');
上述方法中,MONTH函数返回当前月份,YEAR函数返回当前年份。DATE_FORMAT函数将当前时间按指定格式输出。需要注意的是,使用MONTH和YEAR函数获取的月份和年份带有前导零,需要根据情况剔除。
二、获取指定日期的年月
在MySQL中,可以通过对日期进行格式化获得指定日期的年月。
-- 获取2021年6月的年月
SELECT DATE_FORMAT('2021-06-01', '%Y-%m');
上述代码中,DATE_FORMAT函数的第一个参数是需要格式化的日期,第二个参数是输出的格式。%Y表示四位年份,%m表示两位月份。
三、获取最近N个月的年月
MySQL提供了LAST_DAY函数和DATE_ADD函数帮助获取最近N个月的年月。以下是获取最近3个月的年月的方法。
SELECT DATE_FORMAT(LAST_DAY(DATE_SUB(NOW(), INTERVAL 3 MONTH)), '%Y-%m');
上述代码中,LAST_DAY函数返回指定日期所在月份的最后一天。DATE_SUB函数用于从当前日期中减去指定时间间隔,此处为3个月。最后使用DATE_FORMAT按指定格式输出年月。
四、获取所有数据中的不同年月
在某些场景下,需要获取数据库中出现过的所有年月。可以通过GROUP BY子句实现。
-- 获取orders表中所有不同的年月
SELECT DATE_FORMAT(order_date, '%Y-%m')
FROM orders
GROUP BY DATE_FORMAT(order_date, '%Y-%m')
ORDER BY DATE_FORMAT(order_date, '%Y-%m') DESC;
上述代码中,通过DATE_FORMAT函数将order_date字段格式化为年月。使用GROUP BY子句对年月进行分组,得到所有出现过的年月。
五、获取指定时间段内每个月的数据
有时需要获取数据库中指定时间段内每个月的数据,可以使用时间序列表方式实现。以下是获取2021年6月至2021年8月每个月的销售额的方法。
-- 创建时间序列表
CREATE TEMPORARY TABLE squence(month_start DATE, month_end DATE);
SET @startdate := '2021-06-01';
SET @enddate := '2021-08-01';
WHILE @startdate < @enddate DO
INSERT INTO squence VALUES(@startdate, LAST_DAY(@startdate));
SET @startdate := DATE_ADD(@startdate, INTERVAL 1 MONTH);
END WHILE;
-- 查询销售额
SELECT DATE_FORMAT(s.month_start, '%Y-%m') AS month, SUM(o.amount) AS sales
FROM squence s
LEFT JOIN orders o ON o.order_date BETWEEN s.month_start AND s.month_end
GROUP BY month
ORDER BY month;
上述代码中,首先创建了一个临时表squence,用于存储时间序列。其次,使用WHILE循环向squence表中插入数据,每一行表示一个月的时间段。最后使用LEFT JOIN子句将squence表和orders表连接,统计出每个月的销售额。