连续几个月的行加入MySQL中的日期不完整

时间:2017-04-26 14:50:25

标签: mysql date

我有一个MySQL数据库,其中包含一列全部不完整的日期。数据的性质是它是每月数据,因此没有分配该月的任何一天。为了得到一个具体的例子(与实际应用不同),让我们说它是一个月度销售表 - 称之为monthly_sales - 在不同的商店位置,用列

store_name | month_date | sales

分别包含varchar(20)datefloat类型。由于month_date列包含涵盖整月的数据,2016-01-00列只有sales之类的不完整日期。

以下是创建玩具桌的代码:

create table monthly_sales (store_name varchar(20), month_date date, sales float);

insert into monthly_sales values 
('New York', 20160100, 30000), 
('New York', 20160200, 6000), 
('Boston', 20160100, 8000), 
('Boston', 20160200, 3000);

数据库设计 - 无论好坏 - 都是固定的,因此现在无法改变这种设计。

问题在于尝试构建一个连续几个月比较同店销售额的查询。我试过这个问题:

select * from monthly_sales as ms1
join monthly_sales as ms2 on ms1.store_name=ms2.store_name and ms2.month_date=date_sub(ms1.month_date, interval 1 month)

这不起作用,因为date_sub的记录行为是在给定不完整日期时返回null。期望的输出将是

New York | 2016-02-00 | 6000 | New York | 2016-01-00 | 30000
Boston   | 2016-02-00 | 3000 | Boston   | 2016-01-00 | 8000

(注意FWIW,在这种情况下,操作在概念上是明确定义的,因为只有一天未定义,而我在几个月做算术。这类似于两个日期之间的天数差异不考虑该差异日期所附的时间(如果有的话)。)

我在询问之前做了搜索,发现了相关但不同的问题。我相信我的细节不同,以避免被标记为重复。我检查过的问题包括:

这里有哪些解决方法?我并不关心日期算术本身,而是愿意采用其他方式形成联接来实现既定目标。

1 个答案:

答案 0 :(得分:0)

设计可能是固定的,但可能是数据不是......

create table monthly_sales (store_name varchar(20), month_date date, sales float);

insert into monthly_sales values 
('New York', 20160101, 30000), 
('New York', 20160201, 6000), 
('Boston', 20160101, 8000), 
('Boston', 20160201, 3000);

select * from monthly_sales as ms1
join monthly_sales as ms2 on ms1.store_name=ms2.store_name and ms2.month_date=date_sub(ms1.month_date, interval 1 month)

请注意,销售价值不太可能“漂浮”。这就是DECIMAL被发明的原因。