💅 SQL 입문
지난 시간에는 수치(사칙연산)와 문자열에 대해서 알아보았다. 오늘은 수치를 날짜에 대해서 학습해 볼 것이다. 현재 시간, 시간 연산, 시간 범위 등 시간과 관련된 다양한 자료를 학습하고 알아보도록 한다.
📅 날짜 데이터 타입
시간은 '2024년 02월 05일'와 같이 문자열 타입으로 데이터를 관리할 수 있지만, 문자열 타입으로 데이터를 관리한다면 시간끼리의 연산이 필요할 경우 이를 계산하기가 까다로울 것이다. 따라서 SQL에서는 날짜에 관련된 전용 데이터 타입을 지원하니 이를 사용하도록 하자.
날짜 및 시간과 관련된 데이터 타입
1️⃣ date (연/월/일)
2️⃣ time (시/분/초)
3️⃣ datetime (연/월/일/시/분/초)
📅 시간 출력
SELECT CAST('20210418' AS DATETIME)
SELECT CAST('20210418 15:27:45' AS DATETIME)
SELECT CAST('20210418 15:27' AS DATETIME)
CAST는 형 변환을 처리해주는 함수이다. 문자열을 DATETIME 데이터 타입으로 형변환 해주는 코드이다.
형 변환 처리를 도와주는 패턴은 아래와 같다.
- YYYYMMDD
- YYYYMMDD hh:mm:ss.nnn
- YYY-MM-DDhh:mm
위 3가지 패턴에 해당하는 문자열을 입력하면 알아서 잘 받아들인다. 정확히 위 3가지 패턴과 일치할 필요는 없고 좀 덜 입력해도 된다. 첫 번째와 세 번째 문자열은 각각 시간과 초를 덜 입력하였는데 DATETIME으로 잘 형변환되어 출력된 것을 확인 할 수 있다.
📅 현재 시간 출력
⌛ GETDATE()
SELECT GETDATE();
DATETIME 타입으로 현재 시간을 출력해주는 함수이다. 그렇지만 이는 SQL 표준은 아니다.
⌛ CURRENT_TIMESTAMP
SELECT CURRENT_TIMESTAMP
위와 마찬가지로 DATETIME 타입으로 현재 시간을 출력해준다. SQL 표준이며, 함수가 아님을 유의한다.
⌛ GETUTCDATE
-- 현재의 UTC 시간 (GMT 표준시계 기준)
SELECT GETUTCDATE();
현재의 UTC 시간을 출력해주는 함수이다. 글로벌하게 여러 국가에서 사용하는 프로그램의 DB에서 필수로 사용해야 할 함수이다.
📅 시간 연산
⌛ 자동 형변환
INSERT INTO [dbo].[DateTimeTest]
([time])
VALUES
(CAST('20100101' AS DATETIME));
GO
INSERT INTO [dbo].[DateTimeTest]
([time])
VALUES
('20210418') --자동 cast 됨
GO
DateTimeTest 테이블의 time 열은 애초에 데이터 타입을 datetime으로 지정을 해놨기 때문에 문자열 ‘20100101’ 로 행 추가를 한다 하더라도, 아무런 문제 없이 자동으로 형변환되어 datetime 타입으로 들어가게 된다. 따라서 CAST로 형변환 안해주어도 문제 없다. 🤔
⌛ 시간 연산
1️⃣ 시간 범위
SELECT *
FROM DateTimeTest
WHERE time >= CAST('20100101' AS DATETIME); --time 에서 2010년 1월 1일 이상값을 가진 행들 출력
SELECT *
FROM DateTimeTest
WHERE time >= '20100101'; --time 에서 2010년 1월 1일 이상값을 가진 행들 출력
SELECT *
FROM DateTimeTest
WHERE time >= CURRENT_TIMESTAMP; --time 에서 현재 시간 이상값을 가진 행들 출력
마찬가지로 자동 형변환 된다.
2️⃣ DATEADD
n일 후, n초 후, n년 후 이렇게 시간끼리의 덧셈 연산을 할 수 있다.
SELECT DATEADD(YEAR, 1, '20210428') -- 2021-04-28 에서 1 년 후
SELECT DATEADD(DAY, 5, '20210428') -- 2021-04-28 에서 5 일 후
SELECT DATEADD(SECOND, 1, '20210428') -- 2021-04-28 에서 1 초 후
SELECT DATEADD(YEAR, -10, '20210428') -- 2021-04-28 에서 10 년 전
3️⃣ DATEDIFF
두 시간 사이의 첫 번째 인수를 기준으로 한 시간 차를 구해준다.
SELECT DATEDIFF(SECOND, '20210428', '20210503') --2021-04-28 과 20210503 의 초 단위 차이
SELECT DATEDIFF(SECOND, '20210828', '20210503') --2021-08-28 과 20210503 의 초 단위 차이
(세 번째인수 - 두 번째인수)로 연산을 하기 떄문에 두번째 인수가 더 크면 음수가 나오기도 한다.
4️⃣ 시간의 일부만 추출
DATEPART 함수를 사용하거나 YEAR, SECOND 이런식으로 함수를 쓰면 된다.
SELECT DATEPART(YEAR, '20210428') -- 2021-08-28 의 연도만 추출
SELECT YEAR('20210428') -- 2021-08-28 의 연도만 추출
SELECT DAY('20210428') -- 2021-08-28 의 일만 추출
'공부 > 인프런 - Rookiss' 카테고리의 다른 글
Part 5-2-7. SQL 입문 : 집계함수 (COUNT, SUM, AVG, MAX, MIN, DISTINCT) (1) | 2024.02.05 |
---|---|
Part 5-2-6. SQL 입문 : CASE (0) | 2024.02.05 |
Part 5-2-4. SQL 입문 : 수치와 문자열 (1) | 2024.01.25 |
Part 5-2-3. SQL 입문 : ORDER BY, TOP, OFFSET (1) | 2024.01.24 |
Part 5-2-2. SQL 입문 : SELECT FROM WHERE (0) | 2024.01.23 |