在MySQL中返回上一季度的开始和结束日期

时间:2015-03-19 02:26:59

标签: mysql

我如何在MySQL中编写声明以返回上一季度的上一个开始和结束日期?如果我想要在此季度之前的季度的开始和结束日期(即去年十月的开始和去年十二月底),请说。

4 个答案:

答案 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;