Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Bỏ nhóm một hàng thành nhiều hàng dựa trên các phần của ngày

Tôi không chắc về hiệu suất vì tôi không có nhiều kinh nghiệm với các thủ tục được lưu trữ nên có thể có một cách tiếp cận tốt hơn. Ngoài ra, bạn có thể muốn thay đổi cấu trúc của bảng tạm thời (hay còn gọi là. PolicyList ). Dù sao thì…

Điều này cũng có thể được chuyển đổi thành trình kích hoạt trước / sau thay vì thực thi nó mỗi lần.

DROP PROCEDURE IF EXISTS CreatePolicyList;

DELIMITER //
CREATE PROCEDURE CreatePolicyList()
BEGIN
    DECLARE origId, done INT DEFAULT 0;
    DECLARE startD, endD DATE;

    DECLARE cur CURSOR FOR
        SELECT id, StartDate, EndDate FROM Policy;
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;

    DROP TEMPORARY TABLE IF EXISTS PolicyList;
    CREATE TEMPORARY TABLE PolicyList (
        id INT(11) UNSIGNED NOT NULL AUTO_INCREMENT,
        PolicyId INT(11) NOT NULL,
        StartDate DATE NOT NULL,
        EndDate DATE NOT NULL,
        PRIMARY KEY (id)
    ) ENGINE=MyISAM DEFAULT CHARSET=utf8;

    OPEN cur;
    recLoop: LOOP
        FETCH cur INTO origId, startD, endD;
        IF (done)
            THEN LEAVE recLoop;
        END IF;

        -- following is an alternative to keep records like
        -- "2011-05-25, 2011-06-25" in a single record
        -- WHILE startD < DATE_SUB(endD, INTERVAL 1 MONTH) DO
        WHILE startD < DATE_ADD(DATE_SUB(endD, INTERVAL 1 MONTH), INTERVAL 1 DAY) DO
            INSERT INTO PolicyList (PolicyId, StartDate, EndDate)
            VALUES (origId, startD,DATE_SUB(
                DATE_ADD(startD, INTERVAL 1 MONTH),
                INTERVAL 1 DAY
            ));
            SET startD = DATE_ADD(startD, INTERVAL 1 MONTH);
        END WHILE;

        IF startD >= DATE_SUB(endD, INTERVAL 1 MONTH) THEN
            INSERT INTO PolicyList (PolicyId, StartDate, EndDate)
            VALUES (origId, startD, endD);
        END IF;
    END LOOP;
    CLOSE cur;

END //

CALL CreatePolicyList;

và sau đó truy vấn:

SELECT * FROM PolicyList
ORDER BY PolicyId, StartDate;



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Làm cách nào để thoát dấu gạch dưới trong truy vấn chuỗi ở chế độ ngủ đông và SQL?

  2. Truyền tên cột làm tham số trong MySQL

  3. Kết nối MySQL qua đường hầm SSH - làm thế nào để chỉ định máy chủ MySQL khác?

  4. Hiển thị và Ngẫu nhiên Mảng php

  5. Mysql chọn và hiển thị hai cột