All Day Tired

오라클 날짜 DATE 소요시간 본문

Back/DB

오라클 날짜 DATE 소요시간

yu.dev 2024. 9. 12. 17:49

시작일자와 종료일자가 있을 때 이 둘을 빼서 소요시간을 구해야하는 쿼리를 만들어야 했다.

그런데 내가 필요한건 'N일 N시 N분 N초' 이런식으로 조회 되었으면 하고

0일 2시 2분 5초 이렇게 된다면 그냥 2시 2분 5초로 조회되길 원했다.

 

조건
  •  'N일 N시 N분 N초' 로 한 컬럼으로 조회
  • 일시분초에서 일이 0이면 시분초만, 일과 시가 0이면 분초만 ... 이런식으로 조회

 

이걸 만족하기 위해서 일단 with절을 사용했다.

 

쿼리문
WITH TIME_DIFF AS (
     SELECT
            TRUNC((종료일자컬럼 - 시작일자컬럼), 0) AS DAYS
          , (TRUNC((종료일자컬럼 - 시작일자컬럼)*24), 0) - TRUNC((종료일자컬럼 - 시작일자컬럼), 0)*24) AS HOURS
          , (TRUNC((종료일자컬럼 - 시작일자컬럼)*24*60, 0) - TRUNC((종료일자컬럼 - 시작일자컬럼)*24), 0)*60) AS MINUTES
          , (TRUNC((종료일자컬럼 - 시작일자컬럼)*24*60*60, 0) - TRUNC((종료일자컬럼 - 시작일자컬럼)*24*60, 0)*60) AS SECONDS
       FROM 
)
SELECT
       CASE WHEN DAYS > 0
                 THEN DAYS || '일 ' || HOURS || '시간 ' || MINUTES || '분 ' || SECONDS || '초'
            WHEN HOURS > 0
                 THEN HOURS || '시간 ' || MINUTES || '분 ' || SECONDS || '초'
            WHEN MINUTES > 0
                 THEN MINUTES || '분 ' || SECONDS || '초'
            ELSE SECONDS || '초'
        END AS SPEND_TIME
  FROM  TIME_DIFF;

나는 join을 해야했기에 with절에 종료일자, 시작일자가 있는 테이블의 컬럼을 다 넣고 trunc들을 써줬다.

 

일단 이 쿼리로 급한불은 껐는데 분면 2년전에 이런 비슷한 쿼리를 봤었는데 까먹음...ㅠ

코스트가 적은 쿼리를 알고계신다면 꼭 댓글로 알려주세요...

Comments