Mir의 운영환경
본체 DeskTop
O S Windows7 Ultimate K (Service Pack 1)
Application Microsoft SQL Server Management Studio  2012
MS-SQL

Micorsoft SQL Server 2008 R2 (10.50.1765.0)

MS-SQL 특정 기간(시간,날짜) 범위 구하기


MS-SQL 쿼리로 특정 기간의 시작 시간과 마지막 시간를 구해보자.


SQL Server에서 오늘 혹은 이번주, 이전달, 내년, 이번분기 등등 특정 범위를 구해야할 경우가 많다.

그럴경우 아래와 같은 쿼리로 쉽게 구할수 있다.


시작날짜 & 시간

SELECT DATEADD('형식', DATEDIFF('형식', 0, GETDATE()),0)

종료날짜 & 시간

SELECT DATEADD(MS,-3,DATEADD('형식', DATEDIFF('형식', 0, GETDATE()),0))

DATEADD()함수와 DATEDIFF()함수를 이용하여 '형식(DD,MM,YY 등)'에 따라 시작시간과 종료시간을 구할수 있다.

아래 일별, 주별, 월별, 분기별, 년별 시작 시간과 종료 시간을 구하는 예제를 이용하면 기타 다른 범위의 시작시간과 종료시간도 쉽게 구할수 있을것이다.





예제 기준날짜) 2018년 6월 6일 12시 13분 15초(수요일) [2018-06-06 13:12:15.123]


※ 오늘 범위 구하기(오늘의 시작시간 ~ 오늘의 종료시간)

SELECT DATEADD(DD, DATEDIFF(DD, 0, '2018-06-06 13:12:15.123'), 0) AS 오늘시작
     , DATEADD(MS, -3, DATEADD(DD, DATEDIFF(DD, 0, '2018-06-06 13:12:15.123') + 1, 0)) AS 오늘끝

결과 : 2018-06-06 00:00:00.000 ~ 2018-06-06 23:59:59.997


※ 어제 범위 구하기(어제의 시작시간 ~ 어제의 종료시간)

SELECT DATEADD(DD, DATEDIFF(DD, 0, '2018-06-06 13:12:15.123') - 1, 0) AS 어제시작
     , DATEADD(MS, -3, DATEADD(DD, DATEDIFF(DD, 0, '2018-06-06 13:12:15.123'), 0)) AS 어제끝

결과 : 2018-06-05 00:00:00.000 ~ 2018-06-05 23:59:59.997


※ 내일 범위 구하기(내일의 시작시간 ~ 내일의 종료시간)

SELECT DATEADD(DD, DATEDIFF(DD, 0, '2018-06-06 13:12:15.123') + 1, 0) AS 내일시작
     , DATEADD(MS, -3, DATEADD(DD, DATEDIFF(DD, 0, '2018-06-06 13:12:15.123') + 2, 0)) AS 내일끝

결과 : 2018-06-07 00:00:00.000 ~ 2018-06-07 23:59:59.997



※ 이번주 범위 구하기(이번주 월요일 시작시간 ~ 이번주 일요일 종료시간)

SELECT DATEADD(WK, DATEDIFF(WK, 0, '2018-06-06 13:12:15.123'), 0) AS 이번주시작
     , DATEADD(MS, -3, DATEADD(WK, DATEDIFF(WK, 0, '2018-06-06 13:12:15.123') + 1, 0)) AS 이번주끝

결과 : 2018-06-04 00:00:00.000 ~ 2018-06-10 23:59:59.997


※ 전주 범위 구하기(이전주 월요일 시작시간 ~ 이전주 일요일 종료시간)

SELECT DATEADD(WK, DATEDIFF(WK, 0, '2018-06-06 13:12:15.123') - 1, 0) AS 전주시작
     , DATEADD(MS, -3, DATEADD(WK, DATEDIFF(WK, 0, '2018-06-06 13:12:15.123'), 0)) AS 전주끝

결과 : 2018-05-28 00:00:00.000 ~ 2018-06-03 23:59:59.997


※ 다음주 범위 구하기(다음주 월요일 시작시간 ~ 다음주 일요일 종료시간)

SELECT DATEADD(WK, DATEDIFF(WK, 0, '2018-06-06 13:12:15.123') + 1, 0) AS 다음주시작
     , DATEADD(MS, -3, DATEADD(WK, DATEDIFF(WK, 0, '2018-06-06 13:12:15.123') + 2, 0)) AS 다음주끝

결과 : 2018-06-11 00:00:00.000 ~ 2018-06-17 23:59:59.997



※ 이번달 범위 구하기(이번달 1일 시작시간 ~ 이번달 마지막 종료시간)

SELECT DATEADD(MM, DATEDIFF(MM, 0, '2018-06-06 13:12:15.123'), 0) AS 이번달시작
     , DATEADD(MS, -3, DATEADD(MM, DATEDIFF(MM, 0, '2018-06-06 13:12:15.123') + 1, 0)) AS 이번달끝

결과 : 2018-06-01 00:00:00.000 ~ 2018-06-30 23:59:59.997


※ 전달 범위 구하기(이전달 1일 시작시간 ~ 이전달 마지막 종료시간)

SELECT DATEADD(MM, DATEDIFF(MM, 0, '2018-06-06 13:12:15.123') - 1, 0) AS 전달시작
     , DATEADD(MS, -3, DATEADD(MM, DATEDIFF(MM, 0, '2018-06-06 13:12:15.123'), 0)) AS 전달끝

결과 : 2018-05-01 00:00:00.000 ~ 2018-05-31 23:59:59.997


※ 다음달 범위(다음달 1일 시작시간 ~ 다음달 마지막 종료시간)

SELECT DATEADD(MM, DATEDIFF(MM, 0, '2018-06-06 13:12:15.123') + 1, 0) AS 다음달시작
     , DATEADD(MS, -3, DATEADD(MM, DATEDIFF(MM, 0, '2018-06-06 13:12:15.123') + 2, 0)) AS 다음달끝

결과 : 2018-07-01 00:00:00.000 ~ 2018-07-31 23:59:59.997





※ 이번분기 범위 구하기(6월이 들어가는 분기 시작시간 ~ 분기 종료시간)

SELECT DATEADD(QQ, DATEDIFF(QQ, 0, '2018-06-06 13:12:15.123'), 0) AS 이번분기시작
     , DATEADD(MS, -3, DATEADD(QQ, DATEDIFF(QQ, 0, '2018-06-06 13:12:15.123') + 1, 0)) AS 이번분기끝

결과 : 2018-04-01 00:00:00.000 ~ 2018-06-30 23:59:59.997


※ 전분기 범위 구하기(6월 이전 분기 시작시간 ~ 분기 종료시간)

SELECT DATEADD(QQ, DATEDIFF(QQ, 0, '2018-06-06 13:12:15.123') - 1, 0) AS 전분기시작
     , DATEADD(MS, -3, DATEADD(QQ, DATEDIFF(QQ, 0, '2018-06-06 13:12:15.123'), 0)) AS 전분기끝

결과 : 2018-01-01 00:00:00.000 ~ 2018-03-31 23:59:59.997


※ 다음분기 범위 구하기(6월 다음 분기 시작시간 ~ 분기 종료시간)

SELECT DATEADD(QQ, DATEDIFF(QQ, 0, '2018-06-06 13:12:15.123') + 1, 0) AS 다음분기시작
     , DATEADD(MS, -3, DATEADD(QQ, DATEDIFF(QQ, 0, '2018-06-06 13:12:15.123') + 2, 0)) AS 다음분기끝

결과 : 2018-07-01 00:00:00.000 ~ 2018-09-30 23:59:59.997



※ 이번년 범위 구하기(이번년 1월 1일 ~ 12월 31일)

SELECT DATEADD(YY, DATEDIFF(YY, 0, '2018-06-06 13:12:15.123'), 0) AS 이번년시작
     , DATEADD(MS, -3, DATEADD(YY, DATEDIFF(YY, 0, '2018-06-06 13:12:15.123') + 1, 0)) AS 이번년끝

결과 : 2018-01-01 00:00:00.000 ~ 2018-12-31 23:59:59.997


※ 작년 범위 구하기(작년 1월 1일 ~ 12월 31일)

SELECT DATEADD(YY, DATEDIFF(YY, 0, '2018-06-06 13:12:15.123') - 1, 0) AS 작년시작
     , DATEADD(MS, -3, DATEADD(YY, DATEDIFF(YY, 0, '2018-06-06 13:12:15.123'), 0)) AS 작년끝

결과 : 2017-01-01 00:00:00.000 ~ 2017-12-31 23:59:59.997


※ 내년 범위 구하기(작년 1월 1일 ~ 12월 31일)

SELECT DATEADD(YY, DATEDIFF(YY, 0, '2018-06-06 13:12:15.123') + 1, 0) AS 내년시작
     , DATEADD(MS, -3, DATEADD(YY, DATEDIFF(YY, 0, '2018-06-06 13:12:15.123') + 2, 0)) AS 내년끝

결과 : 2019-01-01 00:00:00.000 ~ 2019-12-31 23:59:59.997





※ 관련글


+ Recent posts