안녕하세요, 보는 소스중에 이해가 안되는 소스가 있어 질문드립니다
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번의 과정을 걸치는 이유가 궁금합니다!
남이 짠 코드가 복잡하게 짠 이유를 찾기 보다는.
코드의 목적을 파악하여 새로 짜는것을 추천합니다.
지금 이론적으로만 문법적으로만 접근하시는데
실질적으로 실행을 해보고 결과를 보셔야 합니다.
실행 결과와 문법적 접근을 동시에 해야 정확한 의도를 파악할 수 있습니다.
지금 문법적으로만 접근하여 파악한 의도는 잘못 파악하신 듯 합니다.
지금 이 코드는 쓸데 없이 복잡하긴 한데 의도를 보면
시간까지만 표현하려는 의도입니다. 분단위를 잘라내려는 의도
예) 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')