Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
连接MySQL中日期不完整的连续月份的行_Mysql_Date - Fatal编程技术网

连接MySQL中日期不完整的连续月份的行

连接MySQL中日期不完整的连续月份的行,mysql,date,Mysql,Date,我有一个MySQL数据库,其中包含一列不完整的日期。数据的性质是它是月度数据,因此没有指定月份的哪一天。为了有一个具体的例子(与实际应用程序不同),让我们假设它是一个月销售额表-称之为monthly\u sales-在不同的商店位置,带有列 store_name | month_date | sales 分别使用类型varchar(20)、date和float。month\u date列只有不完整的日期,例如2016-01-00,因为sales列包含涵盖整个月份的数据 下面是创建玩具表的代码,

我有一个MySQL数据库,其中包含一列不完整的日期。数据的性质是它是月度数据,因此没有指定月份的哪一天。为了有一个具体的例子(与实际应用程序不同),让我们假设它是一个月销售额表-称之为
monthly\u sales
-在不同的商店位置,带有列

store_name | month_date | sales
分别使用类型
varchar(20)
date
float
month\u 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\u sub
的记录行为是,当给定的日期不完整时,它返回
null
。预期的输出将是

New York | 2016-02-00 | 6000 | New York | 2016-01-00 | 30000
Boston   | 2016-02-00 | 3000 | Boston   | 2016-01-00 | 8000
(请注意,在本例中,操作在概念上是定义良好的,因为只有日期是未定义的,而我对月份进行算术运算。这类似于计算两个日期之间的天数差,而不考虑日期差中附加的时间(如果有)

我在提问之前进行了搜索,找到了相关但不同的问题。我相信我的在细节上有足够的不同,以避免被标记为重复。在我检查的问题中:

  • 这个问题已经5年多了,是指MySQL的旧版本。它还特别固定在获取日期差异上,而我愿意接受任何能够进行正确逻辑连接的解决方案,即使我从未实际计算过日期差异
  • 这涉及连续几个月,但有完整的日期。(答案还使用嵌套的子查询序列,这些子查询将杀死我的实际应用程序。)

这里有什么解决办法?我不在乎为了自己的目的而做日期运算,我愿意用其他方法来形成连接以实现既定目标。

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

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)

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

第二个链接问题可能无法回答您的问题,但它演示了如何使用一个。@草莓我没有做足够的mysql来知道这里有什么帮助。我添加了代码来创建一个小表,如果这是您想要的。否则,你的评论太隐晦,没有帮助。只要我知道需要什么,我愿意根据需要进行更新。在实际应用中,它不是“销售”,所以不要太担心它是浮动的。手动创建新表是不可能的,因为实际系统中的数据太多了。我想,从代码中的旧表创建一个新表是可以想象的,但在一个大表上代价高昂。不过我会考虑的。谢谢。我不是建议创建一个新表;只是编辑现有的一个!不允许编辑现有表。对我施加的外部约束。这就是我试图通过我的评论传达的,即“设计”是固定的。我指的不仅仅是模式。是的,这不是我们通常在这里所说的“设计”