시간대를 나누어서 복수 레코드 작성 0 3 1,851

by 김선우 [SQL Query] PostgreSQL [2023.03.15 09:35:35]


strart time과 endtime이 있습니다.

예를 들면

start_time : 2023-03-15 09:20:00 

end_time   : 2023-03-15 13:05:00
이라고 한다면 해당 범위의 시간대를 가지고 start_time과 end_time의 레코드를 생성하고 싶습니다

출력결과를 다음과 같이 하고 싶습니다.

start_time end_time
2023-03-15 09:20:00 2023-03-15 09:59:59
2023-03-15 10:00:00 2023-03-15 10:59:59
2023-03-15 11:00:00 2023-03-15 11:59:59
2023-03-15 12:00:00 2023-03-15 12:59:59
2023-03-15 13:00:00 2023-03-15 13:05:00


그럼 의견 부탁드립니다.

 

by jkson [2023.03.15 10:53:18]
WITH date_range AS (
  SELECT
    TIMESTAMP '2023-03-15 09:20:00' AS start_time,
    TIMESTAMP '2023-03-15 13:05:00' AS end_time
),
hour_range AS (
  SELECT
    date_trunc('hour', start_time) + (n - 1) * INTERVAL '1 hour' AS hour_start,
    date_trunc('hour', start_time) + n * INTERVAL '1 hour' - INTERVAL '1 second' AS hour_end
  FROM date_range, generate_series(1, CEIL(EXTRACT(epoch FROM (end_time - start_time))/3600)::integer + 1) AS n
)
SELECT
  CASE
    WHEN start_time > hour_start THEN start_time
    ELSE hour_start
  END AS start_time,
  CASE
    WHEN end_time < hour_end THEN end_time
    ELSE hour_end
  END AS end_time
FROM date_range, hour_range
WHERE hour_start < end_time
ORDER BY start_time;

 


by 마농 [2023.03.15 12:18:05]
SELECT GREATEST(start_time, dt) s
     , LEAST(end_time, dt + INTERVAL '1 HOUR' - INTERVAL '1 SECOND') end_time
  FROM (SELECT TIMESTAMP '2023-03-15 09:20:00' start_time
             , TIMESTAMP '2023-03-15 13:05:00' end_time
        ) a
     , GENERATE_SERIES(DATE_TRUNC('HOUR', start_time), end_time, INTERVAL '1 HOUR') dt
;

 


by jkson [2023.03.15 16:05:42]

심플하군요.

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입