我有一个MySQL数据库,其中包含一列全部不完整的日期。数据的性质是它是每月数据,因此没有分配该月的任何一天。为了得到一个具体的例子(与实际应用不同),让我们说它是一个月度销售表 - 称之为monthly_sales
- 在不同的商店位置,用列
store_name | month_date | sales
分别包含varchar(20)
,date
和float
类型。由于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,在这种情况下,操作在概念上是明确定义的,因为只有一天未定义,而我在几个月做算术。这类似于两个日期之间的天数差异不考虑该差异日期所附的时间(如果有的话)。)
我在询问之前做了搜索,发现了相关但不同的问题。我相信我的细节不同,以避免被标记为重复。我检查过的问题包括:
这里有哪些解决方法?我并不关心日期算术本身,而是愿意采用其他方式形成联接来实现既定目标。
答案 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被发明的原因。