야구 DB에서는 생년월일 말고도, 첫 경기와 마지막 경기에 대한 정보도 확인할 수 있다. 이 테이블의 디자인을 보면 varchar(10)으로 되어 있음을 확인할 수 있다.
즉 4/13/1954 이런 식으로 나누어져 있고, 결정적으로 문자열이므로 년/월/일만 따로 뽑아다 쓰기가 영 좋지 않은 형식이다. 물론 substring을 이용하여 추출은 할 수 있겠다만 굳이 훨씬 편한 기능이 있는데 사서 고생할 이유는 없지 않는가.
sql에서는 CAST라는 문자열을 DATETIME 형식으로 바꾸는 기능이 존재한다.
SELECT CAST('20220822 05:03' AS DATETIME)
가장 많이 사용되는 형식은
YYYYMMDD
YYMMDD hh:mm:ss.nnn
라고 한다. 물론 모든 형식을 하나도 틀림없이 쓸 필요는 없다.
SELECT CAST('20220122' AS DATETIME)--2022-01-22 00:00:00.000
SELECT CAST('2022' AS DATETIME) --2022-01-01 00:00:00.000
와 같이 시분초를 빼거나 극단적으로 년도를 제외한 모든 걸 빼더라도 각각 맨 처음 시간을 기준으로 초기화가 된다.
(그런데 '202204'처럼 년/월만 입력하면 안된다..)
sql에서 현재 시간을 반환하는 기능도 존재한다.
SELECT GETDATE();
SELECT CURRENT_TIMESTAMP;
--둘 다 현재 시간을 반환한다.
둘의 차이점은 함수인지 아닌지 여부만 있고 사실상 같은 기능이라고 보면 된다. 그런데, 이 기능은 현 컴퓨터의 시간을 기준으로 반환하며, 해외와 같은 시차를 고려하지 않는 것이 단점이다.(지금 내가 이 컴퓨터로 GETDATE를 한 결과와 미국에서 컴퓨터로 GETDATE를 한 결과가 다르다.) 이런 문제점을 해결하려면 GETUTCDATE를 사용하면 된다.
--GMT 그리니치 표준 시간 기준
SELECT GETUTCDATE();
주석에 달린 것처럼 영국에 있는 그리니치 표준 시간을 반환한다. 어느 지역에 있던 같은 결과를 반환한다.
날짜를 빼거나 더하는 기능도 있다! 이런 편한 기능을 활용한다면 게임에서 우편물의 보관 기간을 설정하는 등 다양한 분야에서 사용이 될 것이다. 사용방법은 다음과 같다.
SELECT DATEADD(YEAR,1,'20220822') --2023-08-22 00:00:00.000
SELECT DATEADD(DAY,5,'20220822') --2022-08-27 00:00:00.000
SELECT DATEADD(SECOND,30,'20220822') --2022-08-22 00:00:30.000
아까 이야기한 현 시간부터 30일 정도의 보관 기간을 가진 우편물을 설정한다 치면
SELECT DATEADD(DAY,30,GETDATE())--2022-09-21 18:14:51.500
이렇게 활용할 수도 있다. 숫자에 -를 더하면 그만큼 빼진다고 보면 된다.
두 날짜의 차이를 구하는 기능 또한 존재한다.
SELECT DATEDIFF(DAY,'20220821','20220823');-- 이틀 차이이므로, 2가 반환
DATETIME에서 년/월/일... 등만 각각 따로 추출하고 싶다면
SELECT DATEPART(YEAR,'20220822')--2022
SELECT DAY('20220822');--22
SELECT YEAR('20220822');--2022
DATEPART와 DAY는 사실상 같은 기능이다. 이제 굳이 varchar에서 substring을 쓰는 고생같은건 하지 않아도 되는 것이다! 전 게시글과 마찬가지로, 굳이 외울 필요는 없고 이러한 기능이 있다! 만 알고 필요할 때 찾아 활용하면 되겠다.