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
관련글
[MS-SQL] MS-SQL에서 오라클의 DUAL 사용하기 |
[MS-SQL] 현재 날짜, 시간 구하기 (GETDATE()) |
[MS-SQL] GETDATE() 간단히 날짜 더하기 빼기 |
날다의 운영환경 | |
---|---|
본체 | DeskTop |
O S | Windows7 Ultimate K |
Application | Microsoft SQL Server Management Studio 2012 |
MS-SQL | Micorsoft SQL Server 2008 R2 (10.50.1765.0) |
'DBMS > MS-SQL' 카테고리의 다른 글
[MS-SQL] 날짜, 시간차이 구하기 (DATEDIFF) (0) | 2018.06.14 |
---|---|
[MS-SQL] 현재 날짜, 시간 구하기 (GETDATE()) (0) | 2018.06.12 |
[MS-SQL] 특정 일자 요일 구하기 (0) | 2018.06.08 |
[MS-SQL] [Datetime To Varchar] 날짜를 일정형식의 문자로 만들기 (0) | 2018.06.07 |
[MS-SQL] Server 버전채크 (0) | 2018.06.05 |