MS sql- Convert 관련 질문입니다 0 3 1,666

by 갈매기 [SQLServer] [2018.01.20 05:19:32]


안녕하세요. 본 싸이트에서 많은 정보를 얻고 있습니다. 항상 감사드리며 질문드립니다. 

 

테이블에 alarm_dtm이 있습니다. alarm_dtm의 값이 yyyyMMddhhmmss 로 단순텍스르로 기입되어 있습니다. 예를 들면 20180101120118 입니다. 

이 값 직전의 alarm_dtm과의 차이를 일자/시간/분/초 단위로 알고 싶습니다. 

즉 현재 alarm_dtm이 20180111230818 이고 직전 alarm_dtm 이 20180112003744 일 경우, 출력값으로 

0일 1 hour 29 minutes 26 seconds  을 얻고자 합니다. 

 

본 싸이트에서 공부를 하며 제 나름데로 하기와 같이 작성했는데, 보다 간편한 방법은 없는 지 문의 드립니다. 

1. convert+stuff를 사용하여 20180111230818 을 2018-01-11 23:08:18.000 으로 변경하고

2. LAG 사용하여 직전값을 입력하고 

3. datediff와 datepart로 계산을 했습니다. 

 

SELECT alarm_dtm,convert(datetime, stuff(stuff(stuff(alarm_dtm, 9, 0, ' '), 12, 0, ':'), 15, 0, ':')) as alarm_dtm_
	, LAG (convert(datetime, stuff(stuff(stuff(alarm_dtm, 9, 0, ' '), 12, 0, ':'), 15, 0, ':'))) over (ORDER by alarm_dtm) AS Previous_Alarm_dtm
	,datediff(day,0,convert(datetime, stuff(stuff(stuff(alarm_dtm, 9, 0, ' '), 12, 0, ':'), 15, 0, ':'))-LAG (convert(datetime, stuff(stuff(stuff(alarm_dtm, 9, 0, ' '), 12, 0, ':'), 15, 0, ':'))) over (ORDER by alarm_dtm)) as Days
	,datepart(Hour,convert(datetime, stuff(stuff(stuff(alarm_dtm, 9, 0, ' '), 12, 0, ':'), 15, 0, ':'))-LAG (convert(datetime, stuff(stuff(stuff(alarm_dtm, 9, 0, ' '), 12, 0, ':'), 15, 0, ':'))) over (ORDER by alarm_dtm)) as Hours
	,DatePart(Minute,convert(datetime, stuff(stuff(stuff(alarm_dtm, 9, 0, ' '), 12, 0, ':'), 15, 0, ':'))-LAG (convert(datetime, stuff(stuff(stuff(alarm_dtm, 9, 0, ' '), 12, 0, ':'), 15, 0, ':'))) over (ORDER by alarm_dtm)) as Minutes
	,DatePart(Second,convert(datetime, stuff(stuff(stuff(alarm_dtm, 9, 0, ' '), 12, 0, ':'), 15, 0, ':'))-LAG (convert(datetime, stuff(stuff(stuff(alarm_dtm, 9, 0, ' '), 12, 0, ':'), 15, 0, ':'))) over (ORDER by alarm_dtm)) as Seconds

 

 

by 마농 [2018.01.22 08:34:04]

인라인뷰를 이용하여 반복되는 구문을 간략하게 할 수는 있습니다.

WITH t AS
(
SELECT '20180112003744' alarm_dtm
UNION ALL SELECT '20180111230818'
)
SELECT alarm_dtm
     , alarm_dtm_
     , Previous_Alarm_dtm
     , DATEDIFF(Day   , Previous_Alarm_dtm, alarm_dtm_ ) Days
     , DATEPART(Hour  , alarm_dtm_ - Previous_Alarm_dtm) Hours
     , DATEPART(Minute, alarm_dtm_ - Previous_Alarm_dtm) Minutes
     , DATEPART(Second, alarm_dtm_ - Previous_Alarm_dtm) Seconds
  FROM (SELECT alarm_dtm
             , alarm_dtm_
             , LAG(alarm_dtm_) OVER(ORDER BY alarm_dtm) Previous_Alarm_dtm
          FROM (SELECT alarm_dtm
                     , CONVERT(datetime
                     , STUFF(STUFF(STUFF(alarm_dtm, 9, 0, ' '), 12, 0, ':'), 15, 0, ':')
                     ) AS alarm_dtm_
                  FROM t
                ) a
        ) a
;

 


by 기본충실 [2018.01.23 18:03:53]

존경합니다.


by 갈매기 [2018.01.27 01:46:33]

마농님 감사합니다.

Stuff를 3번 사용하는 것 말고는 방법이 없을까요? 

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