我有一张有一些日期的桌子。我需要一个查询,它将返回此表中的最长(最后)日期以及此最大日期所属季度的最后日期。
因此对于数据表
ID| EDATE
--+----------
1|2014-03-06
2|2014-10-12
此查询应返回2014-10-12和2014-12-31。
答案 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