안녕하세요. 본 싸이트에서 많은 정보를 얻고 있습니다. 항상 감사드리며 질문드립니다.
테이블에 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
인라인뷰를 이용하여 반복되는 구문을 간략하게 할 수는 있습니다.
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 ;