굳이 복잡하게 이렇게 시간 로직을 짠 이유가 있을까요? 1 1 2,057

by null00 [2023.05.26 18:15:15]


안녕하세요,  보는 소스중에 이해가 안되는 소스가 있어 질문드립니다

 

convert(varchar(16), dateadd(hour, datepart(hh, cast(등록시간 as datetime)), convert(char(8), cast(등록시간 as datetime),112)),20)

이러한 구문이 있는데요. 굳이 복잡하게 이렇게 길게 한 이유가 뭔가요?

제 나름대로 해석을 해봤는데요... 

 

1)  위의 빨간 구문의 경우 아래와 같은데, 

convert(varchar(16), dateadd(hour, datepart(hh, cast(등록시간 as datetime)), convert(char(8), cast(등록시간 as datetime),112)),20)

 CONVERT(CHAR(19), DATETIME, 20) 는 YYYY-MM-DD HH:MM:SS 이므로 회색글자로 된 부분이 YYYY-MM-DD HH:MM 으로 출력될 것 같구요!

 

2) 바로 위의 회색 구문의 경우 아래와 같은데,

 dateadd(   hour, datepart(hh, cast(등록시간 as datetime)), convert(char(8), cast(등록시간 as datetime),112)  )

회색글자로 된 부분만큼 convert(char(8), cast(등록시간 as datetime),112)에 시간을 더해주는 것 같고

 

3)  바로 위의 회색 구문과 파랑 구문은 각각 아래와 같은데,

datepart(hh, cast(등록시간 as datetime))  -> 등록시간의 시간만 반환

convert(char(8), cast(등록시간 as datetime),112)  -> 등록시간의 YYYMMDD만 반환

로 해석할 수 있는데요.

 

2번의 dateadd(   hour, datepart(hh, cast(등록시간 as datetime)), convert(char(8), cast(등록시간 as datetime),112)  ) 가

결국 현재시간 아닌가요??

 

그냥 곧바로 1번의 convert(varchar(16), 등록시간, 20) 을 해도 될것같은데 굳이 2~3번의 과정을 걸치는 이유가 궁금합니다!

 

 

by 마농 [2023.05.30 02:15:24]

남이 짠 코드가 복잡하게 짠 이유를 찾기 보다는.
코드의 목적을 파악하여 새로 짜는것을 추천합니다.
지금 이론적으로만 문법적으로만 접근하시는데
실질적으로 실행을 해보고 결과를 보셔야 합니다.
실행 결과와 문법적 접근을 동시에 해야 정확한 의도를 파악할 수 있습니다.
지금 문법적으로만 접근하여 파악한 의도는 잘못 파악하신 듯 합니다.
지금 이 코드는 쓸데 없이 복잡하긴 한데 의도를 보면
시간까지만 표현하려는 의도입니다. 분단위를 잘라내려는 의도
예) 2023-05-30 01:54:12 --> 2023-05-30 01:00

등록시간의 자료형이나 저장포멧등을 정확하게 알아야만 정확한 코드를 작성할 수 있습니다.
만약, 등록시간이 VARCHAR 이고 '2023-05-30 01:54:12' 이 형태로 저장된다면?
저는 이렇게 작성하고 싶습니다.
CONCAT(LEFT(등록시간, 14), '00')
자료형이나 저장 포멧이 이와 다르다면 코드도 달라집니다.
만약 datetime 이라면?
CONCAT(CONVERT(VARCHAR(14), 등록시간, 20), '00')

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