MySQL季度的最后一个日期

时间:2014-08-25 20:02:02

标签: mysql sql

我有一张有一些日期的桌子。我需要一个查询,它将返回此表中的最长(最后)日期以及此最大日期所属季度的最后日期。

因此对于数据表

ID|  EDATE
--+----------
 1|2014-03-06
 2|2014-10-12

此查询应返回2014-10-12和2014-12-31。

4 个答案:

答案 0 :(得分:1)

根据我的理解,你想要在本季度的最后一天,所以3月31日,6月30日,9月30日,12月31日?所以你可以使用Gordon Linoff的答案并调整它来做到这一点。

您只需要在月份(日期)上使用个案陈述,并将该年份与年份联系起来。

http://dev.mysql.com/doc/refman/5.1/de/control-flow-functions.html

str_to_date(
    concat(
        year(edate),
        (case
            when month(edate) in (1, 2, 3) then '-03-31'
            when month(edate) in (4, 5, 6) then '-06-30'
            when month(edate) in (7, 8, 9) then '-09-30'
            else '-12-31'
        end)
    ),
    '%Y-%m-%d'
)

答案 1 :(得分:0)

获取最后一个季度的日期有点令人讨厌,但可能。这是一种强力解决方案:

select edate,
       str_to_date(concat(year(edate), '-', 1 + floor((month(edate) - 1)/ 3)) * 3, '-',
                          (case when month(edate) in (1, 2, 3, 10, 11, 12) then 31 else 30 end)),
                   '%Y-%m-%d'
                  )
from table t
order by edate desc
limit 1;

Here是一个演示它的SQL小提琴。

答案 2 :(得分:0)

您可以使用LAST_DAY选择特定月份的最后一天,具体取决于您可能需要将3,6,9,12更改为不同月份的季度结束时间。

select t1.max_date,
(
  case 
  when month(max_date) <= 3
  then last_day(concat(year(max_date),'-3-1'))  
  when month(max_date) <= 6
  then last_day(concat(year(max_date),'-6-1'))
  when month(max_date) <= 9
  then last_day(concat(year(max_date),'-9-1'))
  else last_day(concat(year(max_date),'-12-1'))
  end
) last_quarter_day
from (
    select max(EDATE) max_date from myTable
) t1

答案 3 :(得分:0)

我找到了最简单的答案:

SELECT MAKEDATE(YEAR(edate),1)
       + INTERVAL QUARTER(edate) QUARTER
       - INTERVAL 1 DAY

此查询占用一年的第一天,增加季度并减去1天以获得所需季度的最后一天。因此,所需的查询应如下所示:

SELECT MAX(edate),
       MAKEDATE(YEAR(MAX(edate)),1)
       + INTERVAL QUARTER(MAX(edate)) QUARTER
       - INTERVAL 1 DAY
  FROM table