sourcetip

mysql에서 사용 불가능한 날짜 범위에서 사용 가능한 날짜 범위를 가져오는 방법은 무엇입니까?

fileupload 2023. 9. 10. 12:29
반응형

mysql에서 사용 불가능한 날짜 범위에서 사용 가능한 날짜 범위를 가져오는 방법은 무엇입니까?

저장 프로시저를 만들었습니다.

CREATE PROCEDURE `CheckSlotAvailability`(IN slotId INT)
BEGIN
    DROP TEMPORARY TABLE IF EXISTS tempres1;
    CREATE TEMPORARY TABLE tempres1
    SELECT
        `slot_id`,
        `customer_id`,
        IFNULL(`start`, 'empty') AS `start`,
        IFNULL(`end`, 'empty') AS `end`,
        IFNULL(`in`, 'empty') AS `in`,
        IFNULL(`out`, 'empty') AS `out`,
        `parking_type`,
        `status`
    FROM reservations;

    DROP TEMPORARY TABLE IF EXISTS tempres2;
    CREATE TEMPORARY TABLE tempres2
    SELECT
        slot_id,
        `customer_id`,
        MIN(`start`) AS `start`,
        MAX(`end`) AS `end`,
        MIN(`in`) AS `in`,
        MAX(`out`) AS `out`,
        `parking_type`,
        `status`
    FROM tempres1
    GROUP BY slot_id, customer_id;

    DROP TEMPORARY TABLE IF EXISTS tempres3;
    CREATE TEMPORARY TABLE tempres3
    SELECT * FROM tempres2 WHERE slot_id = slotId;

    SELECT * FROM TEMPRES3;
END

주차 공간의 예약 시간을 반환합니다.

enter image description here

다음 표에서:

enter image description here

가능한 시간을 어떻게 확보할 수 있습니까?

예를 들어 각 slot_id에 대한 시간 범위가 있습니다.

시작:2023-05-30 15:00:00끝:9999-12-30 00:00:00

위의 이미지에 근거해서2023-05-30 18:00:00까지2023-05-30 20:00:00사용 중이며, 이는 사용 가능한 유일한 시간은 다음과 같습니다.

  1. 2023-05-30 15:00:00까지2023-05-30 17:59:59
  2. 2023-05-30 20:00:00까지9999-12-30 00:00:00

한 칸에 예약이 여러 개일 수 있으니 참고해주세요, 가능한 시간만 알려주시면 됩니다.

MySQL/MariaDB: v10.10.2-MariaDB

몇일동안 최선을 다해 해결하려고 노력했지만 나에게는 불가능해 보입니다 :(

미리 감사드립니다.

몇 가지 개념만 알면 논리는 그리 복잡하지 않습니다.사용 날짜가 다음과 같다고 가정합니다.

start_dt end_dt
... ...
2023-06-01 06:00:00 2023-06-01 18:00:00
2023-06-02 06:00:00 2023-06-02 18:00:00
2023-06-03 06:00:00 2023-06-03 18:00:00
2023-06-04 06:00:00 2023-06-04 18:00:00
... ...

그리고 이 입력 범위:

@dt1 @dt2
2023-06-01 12:00:00 2023-06-04 12:00:00

그런 다음 먼저 범위와 교차하는 모든 점유를 찾습니다.결과는 4개의 행이 됩니다. 범위는 1번째 행의 중간에서 시작하여 4번째 행의 중간에서 끝납니다.

이제 결과의 시작 날짜와 종료 날짜를 하나의 열로 당깁니다. 종료 날짜는 사용 가능한 슬롯의 시작 날짜로 처리해야 하며 그 반대의 경우도 마찬가지입니다.입력한 시작 날짜와 종료 날짜를 이 열에 추가하면 완성됩니다.

마지막으로 사용.lag종료일과 시작일을 일치시키는 함수.

다음과 같은 경우:

set @dt1 = '2023-06-01 12:00:00';
set @dt2 = '2023-06-04 12:00:00';
with cte1(dt, type) as (
    select start_dt, 'e' from t where @dt2 > start_dt and end_dt > @dt1
    union all
    select end_dt, 's' from t where @dt2 > start_dt and end_dt > @dt1
    union all
    select @dt1, 's'
    union all
    select @dt2, 'e'
), cte2(dt1, dt2) as (
    select dt, case when type = 's' and lead(type) over (order by dt) = 'e' then lead(dt) over (order by dt) end
    from cte1
)
select *
from cte2
where dt2 is not null
order by dt1

DB<>Fiddle

언급URL : https://stackoverflow.com/questions/76362625/how-to-get-the-available-date-range-from-unavailable-date-range-in-mysql

반응형