DateTime 자료형은 0001-01-01부터 9999-12-31까지 날짜 데이터를 지원합니다.
DateTime 형의 형 변환과 날짜 조회 및 날짜의 일부분을 반환하는 방법입니다.
날짜(DateTime)를 문자로
Convert 함수를 사용하여 문자형으로 변환합니다.
가장 자주 사용하는 21, 23, 112 항목만 정리했습니다.
1
2
3
|
SELECT CONVERT(CHAR(23), GETDATE(), 21) -- 2022-08-26 10:49:13.847
SELECT CONVERT(CHAR(10), GETDATE(), 23) -- 2022-08-26
SELECT CONVERT(CHAR(10), GETDATE(), 112) -- 20220826
|
cs |
Format 문자열을 사용하여 문자로 변환
문자를 날짜(Datetime)로
마찬가지로 Convert 함수를 사용합니다.
1
|
SELECT CONVERT(DATETIME, '2022-08-25')
|
cs |
날짜 비교 방법
1. 날짜 컬럼을 문자열로 변경하여 비교
1
2
3
4
5
|
SELECT 1
FROM (SELECT 1 AS A) AS A
WHERE 1=1
AND CONVERT(CHAR(8), GETDATE(), 112) > '20220825' -- YYYYMMDD
AND CONVERT(CHAR(10), GETDATE(), 23) > '2022-08-25' -- YYYY-MM-DD
|
cs |
2. 문자열을 날짜로 변경하여 비교
1
2
3
4
5
6
|
SELECT 1
FROM (SELECT 1 AS A) AS A
WHERE 1=1
AND GETDATE() > CONVERT(DATETIME, '2022-08-25')
AND GETDATE() > CONVERT(DATE, '2022/08/25')
;
|
cs |
위 두 방법 중에서는 2번 문자열을 날짜로 변경하여 날짜 컬럼을 비교하는 방법이 좋습니다.
1번의 경우는 날짜형 데이터를 문자형으로 변경하여 조회하기 때문에 클러스트형 인덱스를 타고, 2번의 경우는 날짜형 컬럼을 그대로 비교하기 때문에 논클러스트 + 클러스트형 인덱스를 탑니다.
즉, 날짜 데이터를 조회할 때는 문자열을 날짜로 변경하여 조회하는 것이 더 좋은 성능을 발휘합니다.
현재 시간 가져오기
SYSDATETIME은 밀리세컨드의 자릿수가 7자리까지이고 GETDATE는 밀리세컨드의 자릿수가 3자리입니다.
1
2
|
SELECT SYSDATETIME() -- 2022-08-26 12:58:10.7635669 : 7자리 Millisecond 값
SELECT GETDATE() -- 2022-08-26 12:58:27.403 : 3자리 Millisecond 값
|
cs |
날짜 및 시간 부분을 반환하는 함수
날짜의 특정 정보를 반환하는 함수로는 DATENAME과 DATEPART가 있습니다.
DATENAME는 NVARCHAR를 반환하고 DATEPART는 INT를 반환합니다. 이 차이는 요일을 반환하는
'weekday' 항목을 선택할 때 DATENAME은 '금요일', DATEPART는 '6'을 반환합니다.
이 차이를 제외하고 다른 차이는 없습니다.
또한, 날짜 데이터에 문자열도 사용 가능합니다. 문자열을 사용할 때는 모호성 문제를 회피하기 위해 4자리 연도를 사용하는 것을 추천합니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
SELECT DATENAME(year, GETDATE()) -- 2022
SELECT DATENAME(year, '2022-08-26') -- 2022
SELECT DATENAME(month, GETDATE()) -- 08
SELECT DATENAME(dayofyear, GETDATE()) -- 238
SELECT DATENAME(day, GETDATE()) -- 26
SELECT DATENAME(week, GETDATE()) -- 35
SELECT DATENAME(weekday, GETDATE()) -- 금요일
SELECT DATENAME(hour, GETDATE()) -- 13
SELECT DATENAME(minute, GETDATE()) -- 17
SELECT DATENAME(second, GETDATE()) -- 29
SELECT DATENAME(millisecond, GETDATE()) -- 123
SELECT DATENAME(microsecond, GETDATE()) -- 123
SELECT DATEPART(year, GETDATE()) -- 2022
SELECT DATEPART(year, '2022-08-26') -- 2022
SELECT DATEPART(weekday, GETDATE()) -- 6
|
cs |
날짜 계산
DATEADD 함수를 사용합니다.
1
|
SELECT DATEADD(DAY, 1, GETDATE()) -- 2022-08-27 13:38:57.133
|
cs |
해당 날짜에 해당하는 데이터 조회
BETWEEN을 사용하거나 CONVERT을 사용합니다. 성능은 날짜 문자열을 DATETIME으로 변경하여 조회하는 방법이 비용이 적은 방법입니다.
1
2
3
4
5
|
FIND_DATETIME BETWEEN CONVERT(DATETIME, '2022-08-23 00:00:00')
AND CONVERT(DATETIME, '2022-08-23 23:59:59')
CONVERT(VARCHAR(10), GETDATE(), 120) = '2022-08-23'
|
cs |
2022-08-23일 데이터를 조회하고자 할 때 2022-08-23 문자열을 DATETIME으로 변경하여 BETWEEN을 사용하는 것이 비용면에서는 유리합니다.
쿼리는 조금 길지만 저는 문자형을 무조건 날짜 데이터형으로 변경하여 작업하는 걸 추천드립니다.
날짜 차이를 시:분으로 표시하기
날짜 차이를 시:분 형태로 표시할 때는 DATEDIFF 함수를 사용합니다.
1
2
3
4
|
CONVERT(VARCHAR, DATEDIFF(HOUR, A.WIPDTTM_ST, A.WIPDTTM_ED)) + ' : ' + CONVERT(VARCHAR, DATEDIFF(MI, A.WIPDTTM_ST, A.WIPDTTM_ED) % 60)
-- [ 결과 ]
-- 1 : 25
-- 47 : 47
|
cs |
'IT > MSSQL' 카테고리의 다른 글
MSSQL DATETIME 날짜 기간 검색 (0) | 2023.06.23 |
---|---|
MSSQL DATETIME 특정 날짜 구하기 (0) | 2023.06.23 |
MSSQL 쿼리 작성시 SELECT IN 구문에 사용하는 변수 선언(DECLARE) 방법 (0) | 2023.03.24 |
MSSQL WHERE 절에 IN 구문에 사용하기 위해 변수 선언 및 할당 (0) | 2023.02.14 |
MSSQL 그룹화된 데이터 내에서 순번 업데이트를 통해 다시 정렬하기 (0) | 2022.09.27 |
댓글