如何显示上个月的日期列表?

时间:2014-01-31 15:02:50

标签: mysql

我想显示最近30天的完整列表 这是我的疑问:

 select Distinct DATE_FORMAT(transactions.transaction_date,'%c-%d-%Y') as transaction_date,sum(amount)as Amount from transactions group by  DATE_FORMAT(transactions.transaction_date,'%c-%d-%Y')

这是我的查询结果:

enter image description here

但我想要

transaction_date Amount
1-01-2014         0
2-01-2014         0

直到我如何得到完整的结果?

2 个答案:

答案 0 :(得分:1)

这里的典型方法是首先编写一个获取所需日期列表的查询,然后使用外部联接来关联有交易的范围内日期的交易金额。

我的建议是安装common_schema并使用common_schema.numbers表生成日期列表。

例如,您可以运行此类查询以获取最近30天(不包括今天):

select (current_date() - interval n day) as day
from common_schema.numbers
where n between 1 and 30
order by day

然后,您可以将其与现有查询结合使用,以获得所需的结果(我对您的查询进行了一些其他小的更改,以将其限制在相关的日期范围内,并使用DATE()代替DATE_FORMAT()为了简单起见):

select days.day, coalesce(transactions_rollup.total,0)
from
(
  select (current_date() - interval n day) as day
  from common_schema.numbers
  where n between 1 and 30
) days
left outer join (
  select date(transaction_date) as day, sum(amount) as total
  from transactions 
  where transaction_date >= current_date() - interval 30 day
  and transation_date < current_date()
  group by date(transaction_date)
) transactions_rollup on transactions_rollup.day = days.day
order by days.day

答案 1 :(得分:0)

您需要的是生成器视图(类似于PostgreSQL generate_series()函数可获得的视图),其中包含月份的所有日期,没有间隙。不幸的是,MySQL没有这样的功能,因此您需要pregenerate the dates in some calendar table然后将原始查询加入其中,或依赖于某些big enough table