sql >> データベース >  >> RDS >> Mysql

MYSQLで日付を日付範囲に変換する---日付のギャップを処理する方法

    このアプローチはMySQL用です。順序付けられたサブクエリ内の組み合わせ変数を使用して、各「範囲」の共通の開始日を確立します。 CROSS JOINは、変数を初期化するためだけに使用され、行数は変更しません。共通の開始日が確立されると、外部クエリのクエリごとの単純なグループになります。

    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');
    



    1. EFが不要なヌルチェックを使用してSQLクエリを生成するのはなぜですか?

    2. SQLServerはVarcharを日時に変換します

    3. MySQL ORDER BY DESCは高速ですが、ASCは非常に低速です

    4. XAと非XAJDBCドライバーのパフォーマンス?