05 - 2 날짜 함수
날짜 함수는 날짜나 시간 데이터 작업을 위한 다양한 기능을 제공합니다. 날짜 함수의 경우 기간에 따른 데이터를 검색할 때 빈번히 사용되므로 반드시 알아 두는 게 좋습니다. 특히 같은 해나 달, 요일 등 특정 조건에 따라 데이터를 검색할 때 날짜 함수를 사용하면 편리하게 검색할 수 있습니다.
서버의 현재 날짜, 시간 반환하기 : GETDATE, SYSDATETIME 함수
만약 혐재 접속 중인 데이터 베이스 서버의 시간을 확인하려면 GETDATE 함수 또는 SYSDATETIME 함수를 사용합니다. 두 함수의 차이점은 GETDATE 함수는 소수점 3자리까지, SYSDATETIME 함수는 소수점 7자리까지 시간을 표현한다는 점입니다. 참고로 이 함수들은 실행할 때마다 다른 값을 반환하는 비결정적 함수에 속합니다.
※ 반대로, 결정적 함수는 데이터베이스 상태가 같다면 항상 같은 값을 반환하는 함수를 말합니다.
-- 서버의 현재 날짜, 시간 확인 : GETDATE, SYSDATETIME 함수
SELECT GETDATE(), SYSDATETIME()
-- 2023-06-25 19:00:29.137, 2023-06-25 19:00:29.1387006
서버의 현재 UTC 날짜, 시간 반환하기 : GETUTCDATE, SYSUTCDATETIME 함수
현재 접속한 데이터베이스 서버의 협정 세계시, 즉 UTC(Universal Time Coordinated) 시간을 확인하려면 GETUTCDATE 함수나 SYSUTCDATETIME 함수를 사용합니다. 국가마다 시간이 다르므로 전 세계가 같은 시간을 기준으로 사용하고자 1972년 1월 1일부터 UTC 시간을 사용했습니다. 각 함수는 소수점 3자리와 7자리까지의 시간을 반환합니다.
-- 서버의 현재 UTC 날짜, 시간 반환 : GETUTCDATE, SYSUTCDATETIME 함수
SELECT GETDATE(), GETUTCDATE(), SYSUTCDATETIME()
-- 2023-06-25 19:00:30.033, 2023-06-25 10:00:30.033, 2023-06-25 10:00:30.0357369
날짜 더하기 : DATEADD 함수
날짜를 더하거나 빼려면 DATEADD 함수를 사용합니다. DATEADD 함수는 다음과 같이 날짜 형식(datepart), 숫자(year), 더하기나 뺄 대상 날짜(date)를 인자로 받습니다.
-- 날짜 가감 : DATEADD 함수
DATEADD(datepart, year, date)
-- 현재 날짜에서 연도를 1씩 가감
SELECT GETDATE(), DATEADD(year, 1 GETDATE())
-- 2023-06-25 19:00:30.033, 2024-06-25 19:00:30.033
SELECT GETDATE(), DATEADD(year, -1, GETDATE())
-- 2023-06-25 19:00:30.033, 2022-06-25 19:00:30.033
DATEADD 함수에는 year나 quarter와 같은 날짜 형식을 사용할 수 있으며 줄임말로 입력해도 똑같이 작동합니다.
날짜 형식 | 줄임말 | 날짜 형식 | 줄임말 |
year | yy, yyyy | hour | hh |
quarter | qq, q | minute | mi, n |
month | mm, m | second | ss, s |
dayofyear | dy, y | millisecond | ms |
day | dd, d | microsecond | mcs |
week | wk, ww | nanosecond | ns |
weekday | dw, w |
DATEADD 함수에 사용하는 날짜 형식
날짜 차이 구하기 : DATEDIFF 함수
DATEDIFF 함수는 날짜 차이를 구할 수 있습니다. 이 함수는 인자로 날짜 형식(datepart), 시작 날짜(startdate), 종료 날짜(enddate)를 받습니다.
-- 날짜 차이 반환 : DATEDIFF 함수
DATEDIFF(datepart, startdate, enddate)
-- 시작 날짜와 종료 날짜 사이의 기간을 1년 단위로 반환
SELECT DATEDIFF(year, '2019-12-31 23:59:59.9999999', '2021-01-01 00:00:00.0000000');
SELECT DATEDIFF(quarter, '2019-12-31 23:59:59.9999999', '2021-01-01 00:00:00.0000000');
SELECT DATEDIFF(month, '2019-12-31 23:59:59.9999999', '2021-01-01 00:00:00.0000000');
SELECT DATEDIFF(dayofyear, '2019-12-31 23:59:59.9999999', '2021-01-01 00:00:00.0000000');
SELECT DATEDIFF(day, '2019-12-31 23:59:59.9999999', '2021-01-01 00:00:00.0000000');
SELECT DATEDIFF(week, '2019-12-31 23:59:59.9999999', '2021-01-01 00:00:00.0000000');
SELECT DATEDIFF(hour, '2019-12-31 23:59:59.9999999', '2021-01-01 00:00:00.0000000');
SELECT DATEDIFF(minute, '2019-12-31 23:59:59.9999999', '2021-01-01 00:00:00.0000000');
SELECT DATEDIFF(second, '2019-12-31 23:59:59.9999999', '2021-01-01 00:00:00.0000000');
SELECT DATEDIFF(millisecond, '2019-12-31 23:59:59.9999999', '2021-01-01 00:00:00.0000000');
SELECT DATEDIFF(microsecond, '2019-12-31 23:59:59.9999999', '2021-01-01 00:00:00.0000000');
-- 2
-- 5
-- 13
-- 367
지정된 날짜 일부 반환하기 : DATEPART, DATENAME 함수
DATEPART 함수와 DATENAME 함수는 지정된 날짜의 일부를 반환합니다.
-- 지정된 날짜 일부 반환 : DATEPART, DATENAME 함수
DATEPART(datepart, date)
DATENAME(datepart, date)
두 함수의 차이점은, DATEPART 함수는 반환값이 월요일이라면 1과 같은 숫자를, DATENAME 함수는 반환값이 금요일이라면 금요일 그대로 실젯값을 반환한다는 것입니다.
※ 한글 버전은 Month 부분은 숫자로, 영어 버전은 January 등 영어로 표시됩니다.
-- 지정된 날짜 일부 반환 : 반환값 = 숫자
SELECT symbol, last_crawel_date,
DATEPART(YEAR, last_crawel_date),
DATEPART(MONTH, last_crawel_date),
DATEPART(DAY, last_crawel_date),
DATEPART(WEEKDAY, last_crawel_date)
FROM nasdaq_company
-- ^CMC200, 2021-11-05 00:00:00.000, 2021, 11, 5, 6
-- 지정된 날짜 일부 반환 : 반환값 = 실젯값
SELECT symbol, last_crawel_date,
DATENAME(YEAR, last_crawel_date),
DATENAME(MONTH, last_crawel_date),
DATENAME(DAY, last_crawel_date),
DATENAME(WEEKDAY, last_crawel_date)
FROM nasdaq_company
-- ^CMC200, 2021-11-05 00:00:00.000, 2021, 11, 5, 금요일
날짜에서 일, 월, 연도, 가져오기 : DAY, MONTH, YEAR 함수
DAY 함수와 MONTH 함수, YEAR 함수는 각각 날짜에서 일, 월, 연도의 값을 가져옵니다. 큰 의미에서는 DATEPART 함수와 같지만 부분으로 사용하고 싶을 때 유용한 함수입니다.
-- 날짜에서 일, 월, 연도 추출 : DAY, MONTH, YEAR 함수
SELECT symbol, last_crawel_date,
YEAR(last_crawel_date),
MONTH(last_crawel_date),
DAY(last_crawel_date)
FROM nasdaq_company
-- ^CMC200, 2021-11-05 00:00:00.000, 2021, 11, 5
날짜 자료형 또는 형태 변환하기 : CONVERT 함수
CONVERT 함수는 다양한 날짜 형태를 표현할 수 있습니다.
-- 날짜형 형태 변환하고 연결 : CONVERT 함수
SELECT symbol, last_crawel_date,
CONVERT(nvarchar(10), YEAR(last_crawel_date)) + '/' +
CONVERT(nvarchar(10), MONTH(last_crawel_date)) + '/' +
CONVERT(nvarchar(10), DAY(last_crawel_date))
FROM nasdaq_company
-- ^CMC200, 2021-11-05 00:00:00.000, 2021/11/5
하지만 스타일 매개변수를 사용하면 CONVERT 함수를 사용하지 않아도 날짜 형태를 변경할 수 있습니다.
※ 스타일 매개변수는 마이크로소프트 공식 문서에서 자세하게 소개합니다.
-- 스타일 매개변수로 날짜형 형태 변환
SELECT CONVERT(nvarchar(20), last_crawel_date, 120) FROM nasdaq_company
-- 2021-11-05 00:00:00
SELECT CONVERT(nvarchar(20), last_crawel_date, 111) FROM nasdaq_company
-- 2021/11/05
SELECT CONVERT(nvarchar(20), last_crawel_date, 112) FROM nasdaq_company
-- 20211105
포맷 번호의 값 | 작성 형식 | 결과 |
1 | select convert(varchar, getdate(), 1) | mm/dd/yy |
2 | select convert(varchar, getdate(), 2) | yy.mm.dd |
(...생략...) | ||
111 | select convert(varchar, getdate(), 111) | yyyy/mm/dd |
112 | select convert(varchar, getdate(), 112) | yyyymmdd |
날짜 포맷
포맷 번호의 값 | 작성 형식 | 결과 |
8 | select convert(varchar, getdate(), 8) | hh:mm:ss |
14 | select convert(varchar, getdate(), 14) | hh:mm:ss:nnn |
(...생략...) | ||
114 | select convert(varchar, getdate(), 114) | hh:mm:ss:nnn |
시간 포맷
실전 SQL
퀴즈 2. 현재 날짜에서 45일 이전의 날짜와 요일을 구하세요.
SELECT CONVERT(nvarchar(10), DATEADD(day, -45, GETDATE()), 120) AS DATE,
DATENAME(WEEKDAY, DATEADD(day, -45, GETDATE())) AS DATENAME