mysql查询期间数据到每月

yrefmtwq  于 2021-06-20  发布在  Mysql
关注(0)|答案(2)|浏览(223)

我正在尝试创建一个sql查询来解决我的问题。
我使用mysqk5.7。
我的table: |project_id|start |end |cost(per month)| |1 |2018-05-01|2018-06-30|1000 | |2 |2018-06-01|2018-07-31|2000 | 我想按开始列和结束列生成日期列。这样地: |date |project_id|cost| |2018-05|1 |1000| |2018-06|1 |1000| |2018-06|2 |2000| |2018-07|2 |2000|

nzk0hqpo

nzk0hqpo1#

创建一个表并用每个月的第一天填充它。您可以通过编程实现这一点,甚至可以使用excel生成数据并将其移植到mysql。

create table dates (
    start_date date
);

insert into dates values 
('2018-04-01'),
('2018-05-01'),
('2018-06-01'),
('2018-07-01'),
('2018-8-01');

然后,可以运行如下查询:
查询

select 
    date_format(start_date, '%Y-%m') as `Date`,
    a.project_id,
    a.cost
from projects a
inner join dates b on b.start_date between a.start and a.end;

结果

Date    project_id cost
2018-05    1       1000
2018-06    1       1000
2018-06    2       2000
2018-07    2       2000

例子
http://rextester.com/jriuz98116
可供替代的
另一种方法是创建一个存储过程,创建一个包含日期的临时表,这样就不必生成表。可以从表中提取最小开始日期和最大结束日期,以创建临时日期表。
然后,存储过程可以执行与上面相同的连接来生成结果集。

cig3rfwq

cig3rfwq2#

这是其中的一个地方,一个单独的日期表将使生活更轻松。如果你有一张这样的table:

create table DateTable(ThisDate date, Month varchar(7))

添加您可能需要的任何其他列(isweekday等)并将其填充到一个循环中,这样您就可以在各种情况下重用它,包括这个查询。例如,您可以在其上创建一个视图来获取month、startdate、enddate,然后从该视图联接回表中,查找介于开始日期和结束日期之间的日期。
这和其他许多查询将变得简单。

create table DateTable(ThisDate date, Month varchar(7)) 

--- populate the table just once, re-use for all future queries

create view MonthView as 
select Month, 
   min(ThisDate) as StartOfMonth, 
   max(ThisDate) as EndOfMonth 
from DateTable

select Month, ProjectID, Cost 
from MonthView
join MyTab on myTab.Start<=EndOfmonth and myTab.End>=StartofMonth

相关问题