1. MS-SQL 기본 날짜 함수

MS-SQL에서 현재 날짜와 시간을 가져오는 가장 기본적인 함수들입니다.

현재 날짜 및 시간 구하기

-- 현재 날짜와 시간 가져오기
SELECT GETDATE() AS '현재시간';  -- 2025-03-19 14:30:25.123

-- 현재 날짜만 가져오기 (시간 제외)
SELECT CONVERT(DATE, GETDATE()) AS '오늘날짜';  -- 2025-03-19

활용 팁: GETDATE()는 MS-SQL에서 가장 자주 사용하는 날짜 함수입니다. 보고서 생성일, 데이터 입력일 등에 사용하세요.

GETDATE()와 SYSDATETIME() 차이

-- 일반적인 정밀도의 현재 시간 (밀리초까지)
SELECT GETDATE();  -- 2025-03-19 14:30:25.123

-- 고정밀 현재 시간 (나노초까지)
SELECT SYSDATETIME();  -- 2025-03-19 14:30:25.1234567

언제 사용할까? 대부분의 경우 GETDATE()로 충분하지만, 매우 정밀한 시간 기록이 필요한 로깅이나 성능 측정에는 SYSDATETIME()을 사용할 수 있습니다.

 

2. MS-SQL 날짜 추출 및 변환

날짜 구성 요소 추출하기

DECLARE @SampleDate DATETIME = '2025-03-19 14:35:42';

-- 연, 월, 일 추출
SELECT 
    YEAR(@SampleDate) AS '연도',    -- 2025
    MONTH(@SampleDate) AS '월',    -- 3
    DAY(@SampleDate) AS '일';      -- 19

-- 시간 요소 추출
SELECT 
    DATEPART(HOUR, @SampleDate) AS '시',      -- 14
    DATEPART(MINUTE, @SampleDate) AS '분',    -- 35
    DATEPART(SECOND, @SampleDate) AS '초';    -- 42

실무 활용: 월별 매출 보고서나 일자별 통계를 계산할 때 YEAR(), MONTH(), DAY() 함수를 자주 사용합니다.

요일 및 주차 정보 추출

-- 요일 정보 가져오기
SELECT 
    DATEPART(WEEKDAY, @SampleDate) AS '요일숫자',   -- 4 (수요일)
    DATENAME(WEEKDAY, @SampleDate) AS '요일이름';   -- Wednesday

-- 주차 및 분기 정보
SELECT 
    DATEPART(WEEK, @SampleDate) AS '주차',        -- 12
    DATEPART(QUARTER, @SampleDate) AS '분기';     -- 1

DATEPART vs DATENAME: DATEPART는 숫자를, DATENAME은 문자열을 반환합니다. 요일이나 월 이름이 필요하면 DATENAME을 사용해 보세요.

날짜 구성요소로 날짜 만들기

-- 연, 월, 일로 날짜 만들기 (SQL Server 2012 이상)
SELECT DATEFROMPARTS(2025, 3, 19);  -- 2025-03-19

-- 연, 월, 일, 시, 분, 초로 날짜/시간 만들기
SELECT DATETIMEFROMPARTS(2025, 3, 19, 14, 30, 0, 0);  -- 2025-03-19 14:30:00

활용 사례: 사용자 입력 값에서 연, 월, 일을 따로 받았을 때 하나의 날짜로 조합할 수 있습니다.

 

3. MS-SQL 날짜 연산

날짜 더하기/빼기 (DATEADD)

DECLARE @Today DATE = GETDATE();

-- 날짜 더하기/빼기
SELECT 
    DATEADD(DAY, 1, @Today) AS '내일',             -- 2025-03-20
    DATEADD(DAY, -1, @Today) AS '어제',            -- 2025-03-18
    DATEADD(MONTH, 1, @Today) AS '한달후',         -- 2025-04-19
    DATEADD(YEAR, 1, @Today) AS '일년후';          -- 2026-03-19

실무 활용: 만료일 계산(30일 후), 결제 예정일(다음 달), 프로모션 기간(7일 후까지) 등 다양한 업무에 활용합니다.

날짜 간 차이 계산 (DATEDIFF)

DECLARE @StartDate DATE = '2025-01-01';
DECLARE @EndDate DATE = '2025-03-19';

-- 두 날짜 간의 차이 계산
SELECT 
    DATEDIFF(DAY, @StartDate, @EndDate) AS '일수차이',      -- 78
    DATEDIFF(MONTH, @StartDate, @EndDate) AS '월차이',     -- 2
    DATEDIFF(YEAR, @StartDate, @EndDate) AS '연도차이';    -- 0

주의사항: DATEDIFF(MONTH, …)는 단순히 월의 차이만 계산하므로, 1월 31일과 2월 1일의 차이도 1개월로 계산됩니다.

나이 계산하기

-- 생년월일로 정확한 나이 계산
DECLARE @BirthDate DATE = '1990-05-15';
DECLARE @Today DATE = GETDATE();  -- 2025-03-19 가정

SELECT 
    DATEDIFF(YEAR, @BirthDate, @Today) - 
        CASE 
            WHEN (MONTH(@BirthDate) > MONTH(@Today)) OR 
                 (MONTH(@BirthDate) = MONTH(@Today) AND DAY(@BirthDate) > DAY(@Today)) 
            THEN 1 
            ELSE 0 
        END AS '만나이';  -- 34

한국식 나이: 한국식 나이(세는 나이)는 위 계산결과에 1을 더하면 됩니다.

 

4. MS-SQL 날짜 형식 지정

CONVERT로 날짜 형식 지정

DECLARE @SampleDate DATETIME = '2025-03-19 14:35:42';

-- 주요 날짜 형식
SELECT 
    CONVERT(CHAR(10), @SampleDate, 23) AS 'ISO(YYYY-MM-DD)',         -- 2025-03-19
    CONVERT(CHAR(10), @SampleDate, 103) AS 'UK(DD/MM/YYYY)',         -- 19/03/2025
    CONVERT(CHAR(10), @SampleDate, 101) AS 'US(MM/DD/YYYY)',         -- 03/19/2025
    CONVERT(CHAR(19), @SampleDate, 120) AS 'ISO(YYYY-MM-DD HH:MI:SS)'; -- 2025-03-19 14:35:42

활용 사례: 보고서 출력, 사용자 화면 표시, CSV 내보내기 등에서 원하는 형식으로 날짜를 표시할 때 사용합니다.

FORMAT 함수 사용 (SQL Server 2012 이상)

-- FORMAT 함수로 사용자 정의 형식
SELECT 
    FORMAT(GETDATE(), 'yyyy-MM-dd') AS '기본형식',              -- 2025-03-19
    FORMAT(GETDATE(), 'yyyy년 MM월 dd일') AS '한글형식',        -- 2025년 03월 19일
    FORMAT(GETDATE(), 'dddd, MMMM d, yyyy') AS '영문형식';     -- Wednesday, March 19, 2025

CONVERT vs FORMAT: FORMAT은 더 직관적이지만 CONVERT보다 성능이 떨어집니다. 대용량 데이터 처리 시에는 CONVERT를 사용하시길 추천합니다.

 

5. MS-SQL 날짜 범위 다루기

월의 첫날/마지막날 구하기

DECLARE @SampleDate DATE = '2025-03-19';

-- 해당 월의 첫날
SELECT DATEADD(MONTH, DATEDIFF(MONTH, 0, @SampleDate), 0);  -- 2025-03-01

-- 해당 월의 마지막날 (2가지 방법)
SELECT EOMONTH(@SampleDate);  -- 2025-03-31 (SQL Server 2012 이상)
SELECT DATEADD(DAY, -1, DATEADD(MONTH, 1, DATEADD(DAY, 1-DAY(@SampleDate), @SampleDate)));  -- 2025-03-31

실무 활용: 월별 보고서 기간 설정, 월 단위 결제 주기 계산 등에 활용 가능 합니다.

연도 및 분기의 첫날/마지막날

-- 해당 연도의 첫날/마지막날
SELECT 
    DATEFROMPARTS(YEAR(@SampleDate), 1, 1) AS '연도첫날',       -- 2025-01-01
    DATEFROMPARTS(YEAR(@SampleDate), 12, 31) AS '연도마지막날';  -- 2025-12-31

-- 해당 분기의 첫날
SELECT DATEADD(QUARTER, DATEDIFF(QUARTER, 0, @SampleDate), 0);  -- 2025-01-01

분기별 계산: 회계 보고서나 분기별 목표 달성 보고서 작성 시 유용합니다.

 

6. MS-SQL 실무 사례: 자주 사용되는 쿼리

오늘/어제/이번주/이번달 데이터 조회

-- 오늘 데이터 조회
SELECT * FROM Orders
WHERE CONVERT(DATE, OrderDate) = CONVERT(DATE, GETDATE());

-- 어제 데이터 조회
SELECT * FROM Orders
WHERE CONVERT(DATE, OrderDate) = DATEADD(DAY, -1, CONVERT(DATE, GETDATE()));

-- 이번 달 데이터 조회
SELECT * FROM Orders
WHERE YEAR(OrderDate) = YEAR(GETDATE()) 
  AND MONTH(OrderDate) = MONTH(GETDATE());

: 자주 사용하는 날짜 조건은 뷰나 저장 프로시저로 만들어두면 편리합니다.

일별 트렌드 분석 (간결한 버전)

-- 최근 7일간 일별 주문 집계
SELECT 
    CONVERT(DATE, OrderDate) AS OrderDay,
    COUNT(*) AS OrderCount,
    SUM(TotalAmount) AS DailySales
FROM 
    Orders
WHERE 
    OrderDate >= DATEADD(DAY, -6, CONVERT(DATE, GETDATE()))
GROUP BY 
    CONVERT(DATE, OrderDate)
ORDER BY 
    OrderDay;

: 이 쿼리로 요일별 주문 패턴을 파악할 수 있습니다. 주말에 주문이 늘어나는지, 특정 요일에 매출이 집중되는지 확인할 때 사용하면 좋습니다.

월별 매출 비교 (작년 vs 올해)

-- 월별 매출 비교 (작년 vs 올해)
SELECT 
    MONTH(OrderDate) AS OrderMonth,
    SUM(CASE WHEN YEAR(OrderDate) = YEAR(GETDATE())-1 THEN TotalAmount ELSE 0 END) AS LastYearSales,
    SUM(CASE WHEN YEAR(OrderDate) = YEAR(GETDATE()) THEN TotalAmount ELSE 0 END) AS ThisYearSales
FROM 
    Orders
WHERE 
    OrderDate >= DATEFROMPARTS(YEAR(GETDATE())-1, 1, 1)
GROUP BY 
    MONTH(OrderDate)
ORDER BY 
    OrderMonth;

성장률 분석: 이 쿼리로 작년 대비 올해 매출 성장을 쉽게 비교할 수 있습니다. 추가로 퍼센트 계산을 넣으면 성장률도 확인 가능합니다.

날짜별 순위 매기기 (간단한 버전)

-- 월별 최고 매출일 찾기 (Top 3)
SELECT TOP 3
    CONVERT(DATE, OrderDate) AS OrderDay,
    SUM(TotalAmount) AS DailySales
FROM 
    Orders
WHERE 
    YEAR(OrderDate) = 2025 
    AND MONTH(OrderDate) = 3
GROUP BY 
    CONVERT(DATE, OrderDate)
ORDER BY 
    DailySales DESC;

: 매출이 가장 높은 날을 파악하여 특별 이벤트나 프로모션의 효과를 분석할 수 있습니다.

 

7. MS-SQL 시간 관련 함수

시간만 처리해야 하는 경우도 많죠. MS-SQL에서 제공하는 시간 관련 함수들을 알아봅시다.

시간 데이터 타입 (TIME)

-- TIME 데이터 타입 사용 (SQL Server 2008 이상)
DECLARE @CurrentTime TIME = CONVERT(TIME, GETDATE());  -- 현재 시간만 추출
SELECT @CurrentTime;  -- 14:35:42.1234567

-- 문자열에서 시간 변환
DECLARE @TimeString TIME = '14:35:42';
SELECT @TimeString;  -- 14:35:42.0000000

활용 팁: TIME 데이터 타입은 날짜 없이 시간만 저장해야 할 때 유용합니다. 영업 시간, 일정 시간 등을 저장할 때 사용 가능합니다.

시간 구성요소 추출

DECLARE @SampleTime TIME = '14:35:42.123';

-- 시간 구성요소 추출
SELECT 
    DATEPART(HOUR, @SampleTime) AS '시',      -- 14
    DATEPART(MINUTE, @SampleTime) AS '분',    -- 35
    DATEPART(SECOND, @SampleTime) AS '초',    -- 42
    DATEPART(MILLISECOND, @SampleTime) AS '밀리초';  -- 123

참고: 날짜 함수와 동일한 DATEPART 함수를 시간에도 사용할 수 있습니다.

시간 연산

DECLARE @BaseTime TIME = '14:30:00';

-- 시간 더하기/빼기
SELECT 
    DATEADD(HOUR, 2, @BaseTime) AS '2시간후',      -- 16:30:00
    DATEADD(MINUTE, -30, @BaseTime) AS '30분전',   -- 14:00:00
    DATEADD(SECOND, 90, @BaseTime) AS '90초후';    -- 14:31:30

-- 시간 차이 계산
DECLARE @StartTime TIME = '09:00:00';
DECLARE @EndTime TIME = '17:30:00';

SELECT 
    DATEDIFF(HOUR, @StartTime, @EndTime) AS '근무시간(시)',    -- 8
    DATEDIFF(MINUTE, @StartTime, @EndTime) AS '근무시간(분)';  -- 510

업무 활용: 근무 시간 계산, 작업 소요 시간 측정 등에 활용할 수 있습니다.

시간 형식 지정

DECLARE @SampleTime TIME = '14:35:42.123';

-- 다양한 시간 형식
SELECT 
    CONVERT(VARCHAR, @SampleTime) AS '기본형식',                  -- 14:35:42
    CONVERT(VARCHAR, @SampleTime, 108) AS '24시간형식',          -- 14:35:42
    CONVERT(VARCHAR, @SampleTime, 114) AS '밀리초포함',          -- 14:35:42:123
    FORMAT(@SampleTime, 'hh:mm:ss tt') AS '12시간AM/PM';  -- 02:35:42 PM

사용자 친화적 표시: 사용자 인터페이스에 시간을 표시할 때는 지역 설정에 맞는 형식을 사용하는 것이 좋습니다.

실무 사례: 시간 활용

-- 시간대별 주문 분석
SELECT 
    DATEPART(HOUR, OrderTime) AS HourOfDay,
    FORMAT(DATEPART(HOUR, OrderTime), '00') + ':00-' + 
    FORMAT((DATEPART(HOUR, OrderTime) + 1) % 24, '00') + ':00' AS TimeSlot,
    COUNT(*) AS OrderCount
FROM 
    Orders
WHERE 
    OrderDate = '2025-03-19'  -- 특정 날짜의 주문만
GROUP BY 
    DATEPART(HOUR, OrderTime)
ORDER BY 
    HourOfDay;

: 이 쿼리로 하루 중 주문이 가장 많은 시간대를 파악할 수 있습니다. 이를 통해 마케팅 타이밍이나 고객 서비스 인력 배치를 최적화할 수 있습니다.

날짜 비교 주의사항

-- 시간 부분 포함된 날짜 비교 시 주의
DECLARE @OrderDate DATETIME = '2025-03-19 15:30:00';

-- 잘못된 방식 (시간 때문에 일치하지 않음)
SELECT 
    CASE 
        WHEN @OrderDate = '2025-03-19' THEN '일치' 
        ELSE '불일치' 
    END AS Result;  -- '불일치' 반환

-- 올바른 방식 (날짜 부분만 비교)
SELECT 
    CASE 
        WHEN CONVERT(DATE, @OrderDate) = '2025-03-19' THEN '일치' 
        ELSE '불일치' 
    END AS Result;  -- '일치' 반환

흔한 실수: 시간이 포함된 DATETIME과 날짜만 있는 문자열을 비교할 때 발생하는 가장 흔한 오류입니다. 항상 같은 데이터 타입으로 변환한 후 비교하세요.

월말 처리 문제

-- 월말 날짜 이슈
DECLARE @JanLast DATE = '2025-01-31';  -- 1월 31일

-- 한 달 더하기
SELECT DATEADD(MONTH, 1, @JanLast);  -- 결과: 2025-02-28 (2월은 28일까지)

-- 두 달 더하기
SELECT DATEADD(MONTH, 2, @JanLast);  -- 결과: 2025-03-31 (3월은 31일까지)

날짜 계산 주의: 월마다 일수가 다르기 때문에 월 단위 계산 시 예상과 다른 결과가 나올 수 있습니다. 특히 월말 결제일 계산 시 주의가 필요합니다.

윤년 처리

-- 윤년 여부 확인 함수
CREATE FUNCTION dbo.IsLeapYear(@Year INT)
RETURNS BIT
AS
BEGIN
    RETURN CASE 
               WHEN (@Year % 400 = 0) OR 
                    (@Year % 4 = 0 AND @Year % 100 <> 0) 
               THEN 1 
               ELSE 0 
           END;
END;

-- 사용 예
SELECT dbo.IsLeapYear(2024);  -- 1 (윤년)
SELECT dbo.IsLeapYear(2025);  -- 0 (평년)

특정 날짜 유효성 검사: 사용자 입력 날짜의 유효성을 검사할 때 윤년 여부를 확인해야 합니다. 특히 2월 29일의 경우 윤년에만 존재합니다.


 

이번 포스트에서는 MS-SQL 서버의 날짜 및 시간 함수에 대해 알아보았습니다. 실무에서 가장 자주 사용하는 패턴을 중심으로 설명했으니, 필요할 때 참고하시면 좋을 것 같습니다. 날짜 데이터는 거의 모든 비즈니스 애플리케이션에서 필수적인 요소입니다. 특히 보고서 작성, 데이터 분석, 기간 계산 등에서 이런 함수들을 활용하면 작업 효율이 크게 향상됩니다. 혹시 다른 날짜 관련 팁이 필요하시거나 질문이 있으시면 댓글로 남겨주세요! ~~

 

 

댓글 남기기