본문 바로가기
IT/MSSQL

MSSQL DATETIME 날짜형

by ^&**&^ 2023. 6. 23.
반응형

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 문자열을 사용하여 문자로 변환

FORMAT 함수를 사용하여 변환합니다. 

 

1
SELECT FORMAT(GETDATE(), 'yyyyMMddHHmmssfff')  -- 20220826132650793

cs

 

 

문자를 날짜(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

 

반응형

댓글