두개의 date 계산 쿼리 질문 1 7 1,706

by 갈매기 [Oracle 기초] 쿼리 [2016.04.19 06:49:09]


안녕하세요? 미국에서 근무하면서 본 사이트에서 많은 공부를 하고 있습니다. 항상 답변을 해 주시는 모습에 용기를 내여 질문을 올려 봅니다. 

[질문]

1. 원본 테이블에는 alarm_num가 두가지 존재 합니다. 214 번과 210 번 입니다. 

[원하는 사항]

2. Fac_id 별로, dev_id2 가 같은 레코드의 최초 214번이 뜬 날짜와 최초 210번이 뜬 날짜의 차이(시간 포함)를 알고 싶습니다. 

 

[원본]

fac_id YYYYMMDDMMSS Alarm_num Dev_id2
03678 201601021200 214 188
03678 201601051300 210 188
03678 201601041300 214 188
03678 201602221200 210 188
06789 201601011200 214 100
06789 201601050200 214 100
06789 201601091300 210 100
06789 201601091200 214 100
06789 201601121200 210 100

 

[원하는 값]

fac_id Dev_id2 First date of 214 First date of 210 Diff Day Diff Hour
03678 188 201601021200 201601051300 3 1
06789 100 201601011200 201601091300 8 1

부탁 드리겠습니다. 

 

감사합니다. 

by 갈매기 [2016.04.19 07:00:50]

참고로,

MSSQL 입니다. 


by 마농 [2016.04.19 08:31:39]

날짜 데이터의 타입은 뭔가요?

VARCHAR(12) 인가요? 아니면 DATETIME 인가요?


by 마농 [2016.04.19 14:01:41]

일단 문자형이라고 가정하고 다음과 같이...

날짜형이라면 복잡한 변환과정이 필요 없겠죠.

WITH t(fac_id, YYYYMMDDMMSS, Alarm_num, Dev_id2)
AS (      SELECT '03678', '201601021200', 214, 188
UNION ALL SELECT '03678', '201601051300', 210, 188
UNION ALL SELECT '03678', '201601041300', 214, 188
UNION ALL SELECT '03678', '201602221200', 210, 188
UNION ALL SELECT '06789', '201601011200', 214, 100
UNION ALL SELECT '06789', '201601050200', 214, 100
UNION ALL SELECT '06789', '201601091300', 210, 100
UNION ALL SELECT '06789', '201601091200', 214, 100
UNION ALL SELECT '06789', '201601121200', 210, 100
)
SELECT fac_id, Dev_id2
     , s "First date of 214"
     , e "First date of 210"
     , DATEDIFF(DAY , st, et)    "Diff Day"
     , DATEDIFF(HOUR, st, et)%24 "Diff Hour"
  FROM (SELECT fac_id, Dev_id2
             , s, e
             , CAST( SUBSTRING(s,  1, 8) + ' '
                   + SUBSTRING(s,  9, 2) + ':'
                   + SUBSTRING(s, 11, 2) AS DATETIME) st
             , CAST( SUBSTRING(e,  1, 8) + ' '
                   + SUBSTRING(e,  9, 2) + ':'
                   + SUBSTRING(e, 11, 2) AS DATETIME) et
          FROM (SELECT fac_id, Dev_id2
                     , MIN(CASE Alarm_num WHEN 214 THEN YYYYMMDDMMSS END) s
                     , MIN(CASE Alarm_num WHEN 210 THEN YYYYMMDDMMSS END) e
                  FROM t
                 GROUP BY fac_id, Dev_id2
                ) a
        ) a
 ORDER BY fac_id, Dev_id2
;

 


by 갈매기 [2016.04.19 22:31:07]

마농님, 

 

감사합니다. 아직 초보라 상기와 같은 생각을 하지 못했네요. SQL 구문에 대해 설명 부탁 드려도 될까요? 

From절에 Select들어가고 다시 From 절에 Select가 들어가 있어 제 수준에서는 해석이 힘드네요. %24의 의미도 궁금합니다. 

자세히 다뤄 주시면 감사하겠습니다. 


by 마농 [2016.04.20 08:34:32]

SELECT 안의 SELECT 는 INLINEVIEW 리고 합니다.

쿼리 안의 쿼리. 즉, 서브쿼리죠.

with 절은 실제 테이블 대신 사용한 거구요.

제일 안쪽 서브쿼리부터 단계별로 차례대로 실행해서 결과 확인해 보시면 이해하는데 도움이 될 듯 하네요.

% 는 나머지를 구하는 연산자 입니다.

 


by 갈매기 [2016.04.19 22:34:06]

날짜 데이터는 문자형입니다. 


by 갈매기 [2016.04.20 23:43:48]

마농님, 

 

차근히 실행해서 결과 확인하며 공부하겠습니다. 

용기를 주셔서 감사합니다. 

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