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

連続した日付のコレクションを取得する

    わかりました。基本的に、各LEFT JOINで、非常に簡単でした。 渡されたパラメータで開始日を除外する必要がありました。

    また、休暇が承認されたかどうか、Approved_DateTimeでフィルタリングする必要がありました。 およびApproved_By 承認された場合に入力されたフィールド。また、期間の計算は、状況によっては少しずれていました。したがって、ストアドプロシージャは次のようになります。

    DELIMITER $$
    
    USE `test`$$
    
    DROP PROCEDURE IF EXISTS `GetLeaveDates`$$
    
    CREATE DEFINER=`root`@`%` PROCEDURE `GetLeaveDates`(pEmpID INT, pDateFrom DATETIME, pDateTo DATETIME, pApproved BOOLEAN)
    BEGIN
    
    SELECT 
        DATE_FORMAT(a.start_date,'%d/%m/%y') AS start,
    CASE WHEN a.am_pm = 1 THEN "AM"
         WHEN a.am_pm = 2 THEN "PM"
         ELSE "" END AS start_am_pm,
        DATE_FORMAT(CASE WHEN pDateTo > MIN(c.start_date) THEN
            MIN(c.start_date)
        ELSE
            pDateTo
        END, '%d/%m/%y') AS end,
    CASE WHEN c.am_pm = 1 THEN "AM"
         WHEN c.am_pm = 2 THEN "PM"
         ELSE "" END AS end_am_pm,
      CASE WHEN a.am_pm = 0 THEN
        CASE WHEN c.am_pm = 0 OR c.am_pm = 2 THEN
            DATEDIFF(MIN(c.start_date),a.start_date)+1
        WHEN c.am_pm = 1 THEN
            DATEDIFF(MIN(c.start_date),a.start_date)+0.5
        END
    WHEN a.am_pm = 1 THEN
        CASE WHEN c.am_pm = 0 OR c.am_pm = 2 THEN
            DATEDIFF(MIN(c.start_date),a.start_date)+1
        WHEN c.am_pm = 1 THEN
            DATEDIFF(MIN(c.start_date),a.start_date)+0.5
        END
    WHEN a.am_pm = 2 THEN
        CASE WHEN c.am_pm = 0 OR c.am_pm = 2 THEN
            DATEDIFF(MIN(c.start_date),a.start_date)+0.5
        WHEN c.am_pm = 1 THEN
            DATEDIFF(MIN(c.start_date),a.start_date)
        END 
    END AS Duration
    
    FROM t AS a
    LEFT JOIN t AS b ON a.employee_id=b.employee_id AND a.start_date = ADDDATE(b.start_date,1) AND ISNULL(b.approved_datetime) <> pApproved AND b.start_date BETWEEN pDateFrom AND pDateTo
    LEFT JOIN t AS c ON a.employee_id=c.employee_id AND a.start_date <= c.start_date AND ISNULL(c.approved_datetime) <> pApproved AND c.start_date BETWEEN pDateFrom AND pDateTo
    LEFT JOIN t AS d ON c.employee_id=d.employee_id AND c.start_date = ADDDATE(d.start_date,-1) AND ISNULL(d.approved_datetime) <> pApproved AND d.start_date BETWEEN pDateFrom AND pDateTo
    WHERE b.start_date IS NULL AND c.start_date IS NOT NULL AND d.start_date IS NULL
    AND a.EMPLOYEE_ID = pEmpID
    AND a.START_DATE BETWEEN pDateFrom AND pDateTo
    AND ISNULL(a.approved_datetime) <> pApproved
    AND a.start_date BETWEEN pDateFrom AND pDateTo
    GROUP BY a.employee_id, a.start_date
    ; END$$
    
    DELIMITER ;
    



    1. PL / SQL:プロシージャでユーザー入力を促すにはどうすればよいですか?

    2. 現在のページ番号を強調表示するPHPページネーション

    3. Python:MySQL接続は開いていますが、カーソルを作成できません

    4. MySQL接続文字列のpooling=falseはどういう意味ですか?