我如何在MySQL中编写声明以返回上一季度的上一个开始和结束日期?如果我想要在此季度之前的季度的开始和结束日期(即去年十月的开始和去年十二月底),请说。
答案 0 :(得分:8)
试试这个:
SELECT
MAKEDATE(YEAR(CURDATE()), 1) + INTERVAL QUARTER(CURDATE())-1 QUARTER - INTERVAL 1 DAY,
MAKEDATE(YEAR(CURDATE()), 1) + INTERVAL QUARTER(CURDATE())-2 QUARTER
答案 1 :(得分:1)
我发现使用这个TRUNC_QUARTER
存储函数很有帮助。它将任何日期或日期/时间值转换为发生日历季度的第一天的午夜。然后你可以使用INTERVAL
算术来操纵它。
DELIMITER $$
DROP FUNCTION IF EXISTS TRUNC_QUARTER$$
CREATE
FUNCTION TRUNC_QUARTER(datestamp DATETIME)
RETURNS DATE DETERMINISTIC NO SQL
COMMENT 'returns preceding first of the quarter'
RETURN DATE(CONCAT(YEAR(datestamp),'-', 1 + 3*(QUARTER(datestamp)-1),'-01'))$$
DELIMITER ;
有了它,你可以写:
SELECT TRUNC_QUARTER(CURDATE()) - INTERVAL 1 QUARTER start_last_quarter,
TRUNC_QUARTER(CURDATE()) - INTERVAL 1 DAY end_last_quarter
答案 2 :(得分:0)
季度的开始和结束是固定的,所以没有必要实际“计算”那些 - 我们知道他们是1月1日,4月1日等,3月31日,6月30日等分别。
所以剩下的就是在正确的日期前加上正确的年份 - 如果当前季度是Q1,那么回去一年,否则使用当前年份。
QUARTER(NOW())
会给我们当前的季度(从1到4),所以这可能就像这样简单:
SELECT
CASE QUARTER(NOW())
WHEN 1 THEN DATE_FORMAT(NOW() - INTERVAL 1 YEAR, '%Y-10-01')
WHEN 2 THEN DATE_FORMAT(NOW(), '%Y-01-01')
WHEN 3 THEN DATE_FORMAT(NOW(), '%Y-04-01')
WHEN 4 THEN DATE_FORMAT(NOW(), '%Y-07-01')
END AS previous_quarter_begin,
CASE QUARTER(NOW())
WHEN 1 THEN DATE_FORMAT(NOW() - INTERVAL 1 YEAR, '%Y-12-31')
WHEN 2 THEN DATE_FORMAT(NOW(), '%Y-03-31')
WHEN 3 THEN DATE_FORMAT(NOW(), '%Y-06-30')
WHEN 4 THEN DATE_FORMAT(NOW(), '%Y-09-30')
END AS previous_quarter_end
http://sqlfiddle.com/#!9/9eecb/1858
如果您希望这些日期采用不同的格式,比如mm / dd / yyyy,那么您只需将指定的格式更改为10/01/%Y
等。
(如果您想对此进行测试,看看它是否在不同日期实际运行正常,那么您可以将上述查询中每次出现的NOW()
替换为固定日期,例如{{1}看看这是否会给出12月份日期的预期结果。)
答案 3 :(得分:0)
如果日期在第一季度,它将回溯到第四季度的上一年。
SELECT @dateLastQuarter := DATE_SUB('yourdate', INTERVAL 3 MONTH);
SELECT MAKEDATE(YEAR(@dateLastQuarter), 1) + INTERVAL QUARTER(@dateLastQuarter) QUARTER - INTERVAL 1 QUARTER,
MAKEDATE(YEAR(@dateLastQuarter), 1) + INTERVAL QUARTER(@dateLastQuarter) QUARTER - INTERVAL 1 DAY;