카테고리 없음

날짜 관련

SojuMan 2009. 3. 16. 14:00
SQL Server에서 제공하는 날짜 관련 함수를 이용해서 날짜와 관련된 몇 가지 재미있는 쿼리문을 만들어 보도록 하겠습니다.



먼저 날짜 관련 함수를 소개합니다.
           

DATEDIFF
지정한 두 날짜 간에 교차되는 날짜와 시간 경계값을 반환합니다.

구문
DATEDIFF ( datepart , startdate , enddate )


DATEADD
지정한 날짜에 시간 간격을 더하여 새 datetime 값을 반환합니다.

구문
DATEADD ( datepart , number, date )


위 함수들에서 흥미있는 것은 날짜 부분에 0 이 들어가면 '1900-01-01  00:00:00.000'을 의미한다는 것입니다.




먼저 해당 달의 첫째 날을 구하는 함수입니다.
해당 달의 첫째 날은 당근 "01"일 이겠죠?

           

-- 쿼리 : 현재달의 첫째 날 구하기
SELECT DATEADD(mm, DATEDIFF(mm, 0, getdate()), 0)

-- 결과
2003-11-01 00:00:00.000




DATEDIFF()함수는 총 세가지 인자를 갖는데
첫번째 인자는 날짜부분인데, mm은 달을 나타냅니다.
두번째 인자는 시작일자인데, 여기는 0 이죠? 0은 '1900-01-01 00:00:00.000'을 의미합니다.
마지막 세번째 인자는 계산의 종료일자입니다. getdate()는 현재 날자와 시간을 리턴하는 함수이다.

즉 위 쿼리문의 의미는 1900-01-01 00:00:00.000과 현재 시간의 차이를 달의 수로 구하고
다시 DATEADD()함수를 통해 1900-01-01 00:00:00.000에 달의 차이를 더한 결과입니다.
그럼 해당 달의 첫째 일자가 나옵니다.



그럼 해당 달의 마지막 날짜는 ?
           

-- 쿼리1 : 현재 달의 마지막 날 구하기
SELECT DATEADD(day, -1, DATEADD(mm, 1, DATEADD(mm, DATEDIFF(mm, 0, getdate()), 0)))

-- 결과1
2003-11-30 00:00:00.000



-- 쿼리2
SELECT DATEADD(ms, -3, DATEADD(mm, DATEDIFF(m, 0, getdate())+1, 0))

-- 결과2
2003-11-30 23:59:59.997




쿼리1 방법은 현재 달의 첫째 날에다가 한 달을 더해 주고, 하루를 빼주면 현재 달의 마지막 날이 구해집니다.
    엄밀히 말해 시간/분/초까지 따지면 마지막 순간은 아니지만 날짜 까지만 생각한다면 사용할 수 있는 쿼리문입니다.
쿼리2 방법은
    DATEDIFF(mm, 0, getdate())은 1900-01-01 00:00:00.00와 현재의 개월 수를 구하고
    DATEADD(mm, DATEDIFF(m, 0, getdate())+1, 0)는 1900-01-01 00:00:00.00에 구한 개월 수를 더합니다.
        그러면 2003-12-01 00:00:00.000 이런 결과가 나올것입니다.
    마지막으로 SELECT DATEADD(ms, -3, DATEADD(mm, DATEDIFF(m, 0, getdate())+1, 0))는
        SQL Server에서 저장할 수 있는 하루의 마지막 milliseocond가 23:59:59.997이기 때문에
        3 milliseconds를 빼주면 됩니다.



           

--현재 주의 월요일 구하기
SELECT DATEADD(wk, DATEDIFF(wk, 0, getdate()), 0)

-- 결과
2003-11-10 00:00:00.000



DATEDIFF(yy, 0, getdate())는 1900-01-01 00:00:00.000과 현재의 차이를 년수로 구하고
DATEADD(yy, DATEDIFF(yy, 0, getdate()), 0) 는 1900-01-01 00:00:00.000에 차이난 년수를 더하는 쿼리입니다.



           

--현재 해의 첫째 날 구하기
SELECT DATEADD(yy, DATEDIFF(yy, 0, getdate()), 0)

-- 결과
2003-01-01 00:00:00.000



DATEDIFF(yy, 0, getdate())는 1900-01-01 00:00:00.000과 현재의 차이를 년수로 구하고
DATEADD(yy, DATEDIFF(yy, 0, getdate()), 0) 는 1900-01-01 00:00:00.000에 차이난 년수를 더하는 쿼리입니다.



           

--현재 해의 마지막 날 구하기
SELECT DATEADD(ms, -3, DATEADD(yy, DATEDIFF(yy, 0, getdate())+1, 0))

-- 결과
2003-12-31 23:59:59.997



1900-01-01 00:00:00.000 과 현재의 년수의 차이를 구하고 다시 1년을 더 더합니다.
그 차이를 1900-01-01 00:00:00.000에 대해주면, 즉 SELECT DATEADD(yy, DATEDIFF(yy, 0, getdate())+1, 0) 를 실행하시면 2004-01-01 00:00:00.000 결과가 나오는데, 여기다 3 milliseconds를 빼주면 원하는 결과를 구하실 수 있습니다.



           

--현재분기의 첫째날 구하기
SELECT DATEADD(qq, DATEDIFF(qq, 0, getdate()), 0)

-- 결과
2003-10-01 00:00:00.000



날짜 부분의 qq 는 분기를 추출하는 인자입니다.
1900-01-01 00:00:00.000 과 현재의 분기 차이를 구하고, 그 차이를 1900-01-01 00:00:00.000에 대해주면, 현재 분기의 시작일을 구할수 있습니다.



           

--현재분기의 마지막날 구하기
SELECT DATEADD(qq, DATEDIFF(qq, 0, getdate()), 0)

-- 결과
2003-10-01 00:00:00.000



날짜 부분의 qq 는 분기를 추출하는 인자입니다.
1900-01-01 00:00:00.000 과 현재의 분기 차이를 구하고, 그 차이를 1900-01-01 00:00:00.000에 대해주면, 현재 분기의 시작일을 구할수 있습니다.



           

--전 분기의 마지막날 구하기
SELECT DATEADD(ms, -3, DATEADD(qq, DATEDIFF(qq, 0, getdate()), 0))

-- 결과
2003-09-30 23:59:59.997



날짜 부분의 qq 는 분기를 추출하는 인자입니다.
1900-01-01 00:00:00.000 과 현재의 분기 차이를 구하고, 그 차이를 1900-01-01 00:00:00.000에 대해주면, 현재 분기의 시작일을 구할수 있고, 3 milliseconds를 빼주면 원하는 결과를 구하실 수 있습니다.