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
주차 공간의 예약 시간을 반환합니다.
다음 표에서:
가능한 시간을 어떻게 확보할 수 있습니까?
예를 들어 각 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
사용 중이며, 이는 사용 가능한 유일한 시간은 다음과 같습니다.
2023-05-30 15:00:00
까지2023-05-30 17:59:59
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
언급URL : https://stackoverflow.com/questions/76362625/how-to-get-the-available-date-range-from-unavailable-date-range-in-mysql
'sourcetip' 카테고리의 다른 글
날짜/시간 추가에 대한 기준? (0) | 2023.09.10 |
---|---|
PHP에서 따옴표를 빼는 중 (0) | 2023.09.10 |
jQuery를 사용하여 호버에 툴팁 메시지를 표시하려면 어떻게 해야 합니까? (0) | 2023.09.10 |
jQuery를 사용하여 파일 다운로드 (0) | 2023.09.10 |
malloc 선언이 포함된 헤더 파일의 이름은 무엇입니까? (0) | 2023.09.10 |