将日期转换为MYSQL中的日期范围-如何处理日期中的间隔 [英] Transform Dates into Date Range in MYSQL---how to handle gaps in the dates

查看:88
本文介绍了将日期转换为MYSQL中的日期范围-如何处理日期中的间隔的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在寻找将以下数据转换为所需输出的帮助.我们需要在Item,LOC DAY级别的数据,这些数据需要转换为Item,Loc Date Range,以减少表中的记录数以及满足其他要求.

I am looking for a help in transforming below data into the required output. We have data at Item,LOC DAY level data which needs to be transformed to Item,Loc Date Range to reduce the number of records in the table and for other requirements.

Item        LOC  RP_DATE    RP_IND   
1003785256  543 2016-11-05  Y
1003785256  543 2016-11-06  Y
1003785256  543 2016-11-07  Y
1003785256  543 2016-11-09  Y
1003785256  543 2016-11-10  Y
1003790365  150 2016-11-05  Y
1003797790  224 2016-11-05  Y
1003797790  224 2016-11-06  Y
1003797790  224 2016-11-07  Y
1003797790  224 2016-11-08  Y

必需的输出:

Item        LOC  RP_ST_DATE    RP_END_DATE   
1003785256  543 2016-11-05   2016-11-07
1003785256  543 2016-11-09   2016-11-10
1003790365  150 2016-11-05   2016-11-05
1003797790  224 2016-11-05   2016-11-08

推荐答案

此方法适用于MySQL.它在有序子查询中使用组合变量来为每个范围"建立共同的开始日期. CROSS JOIN仅用于初始化变量,它不会更改行数.一旦确定了共同的开始日期,它将在外部查询中成为按查询的简单分组.

This approach is for MySQL. It uses a combination variables within an ordered subquery to establish a common starting date for each "range". The CROSS JOIN is used just to initialize the variables, it does not alter the number of rows. Once the common starting date is established then it becomes a simple group by query in the outer query.

SELECT Item, LOC, RP_IND, dr_begin, MAX(RP_DATE) dr_end
FROM (
  SELECT
         mytable.*
       , @fin := CONVERT(IF(@item<=>item AND @loc<=>loc AND DATEDIFF(rp_date, @d)=1, @fin, rp_date), DATE) AS dr_begin
       , @item := item
       , @loc := loc
       , @d := rp_date
  FROM     mytable CROSS JOIN (SELECT @item:=NULL, @loc:=NULL, @d:=NULL, @fin := NULL) AS init
  ORDER BY item, loc, rp_date
  ) d
GROUP BY  Item, LOC, RP_IND, dr_begin
;

+----+------------+-----+--------+------------+---------------------+
|    |    Item    | LOC | RP_IND |  dr_begin  |       dr_end        |
+----+------------+-----+--------+------------+---------------------+
|  1 | 1003785256 | 543 | Y      | 2016-11-05 | 07.11.2016 00:00:00 |
|  2 | 1003785256 | 543 | Y      | 2016-11-09 | 10.11.2016 00:00:00 |
|  3 | 1003790365 | 150 | Y      | 2016-11-05 | 05.11.2016 00:00:00 |
|  4 | 1003797790 | 224 | Y      | 2016-11-05 | 08.11.2016 00:00:00 |
+----+------------+-----+--------+------------+---------------------+

注意< => 如果两个操作数均为NULL,则返回1

请参阅以下查询: http://rextester.com/SEYG96251

#drop table mytable;

CREATE TABLE mytable(
   Item    INTEGER  NOT NULL
  ,LOC     INTEGER  NOT NULL
  ,RP_DATE DATE  NOT NULL
  ,RP_IND  VARCHAR(1) NOT NULL
);
INSERT INTO mytable(Item,LOC,RP_DATE,RP_IND) VALUES (1003785256,543,'2016-11-05','Y');
INSERT INTO mytable(Item,LOC,RP_DATE,RP_IND) VALUES (1003785256,543,'2016-11-06','Y');
INSERT INTO mytable(Item,LOC,RP_DATE,RP_IND) VALUES (1003785256,543,'2016-11-07','Y');
INSERT INTO mytable(Item,LOC,RP_DATE,RP_IND) VALUES (1003785256,543,'2016-11-09','Y');
INSERT INTO mytable(Item,LOC,RP_DATE,RP_IND) VALUES (1003785256,543,'2016-11-10','Y');
INSERT INTO mytable(Item,LOC,RP_DATE,RP_IND) VALUES (1003790365,150,'2016-11-05','Y');
INSERT INTO mytable(Item,LOC,RP_DATE,RP_IND) VALUES (1003797790,224,'2016-11-05','Y');
INSERT INTO mytable(Item,LOC,RP_DATE,RP_IND) VALUES (1003797790,224,'2016-11-06','Y');
INSERT INTO mytable(Item,LOC,RP_DATE,RP_IND) VALUES (1003797790,224,'2016-11-07','Y');
INSERT INTO mytable(Item,LOC,RP_DATE,RP_IND) VALUES (1003797790,224,'2016-11-08','Y');

这篇关于将日期转换为MYSQL中的日期范围-如何处理日期中的间隔的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆