[SQL] TSQL : 어떻게 주어진 날짜 범위 사이의 각 달의 마지막 날짜를 검색
SQLTSQL : 어떻게 주어진 날짜 범위 사이의 각 달의 마지막 날짜를 검색
나는 예를 2013년 8월 8일 및 2013년 11월 11일 두 날짜를 가지고 있고 개별적으로 그 날짜를 선택하기 위해 테이블을 반복 할 수 있도록 나는 테이블 8 월에서 11 월부터 매월 마지막 날짜가 필요합니다.
나는 어떤 달 마지막 날짜를 선택하는 방법을 알고하지만 난 날짜 범위에 붙어입니다.
친절하게 도움이, 그것은 높게 평가 될 것입니다.
참고 : 나는 SQL 2008을 사용하고 있습니다 및 기간을 1 개월 2 개월 6개월 또는 너무 년 또는 최대 수 ...
해결법
-
==============================
1.당신은 정의 된 범위 내에서 해당 월의 모든 마지막 날을 얻기를위한 CTE를 사용할 수 있습니다
당신은 정의 된 범위 내에서 해당 월의 모든 마지막 날을 얻기를위한 CTE를 사용할 수 있습니다
Declare @Start datetime Declare @End datetime Select @Start = '20130808' Select @End = '20131111' ;With CTE as ( Select @Start as Date,Case When DatePart(mm,@Start)<>DatePart(mm,@Start+1) then 1 else 0 end as [Last] UNION ALL Select Date+1,Case When DatePart(mm,Date+1)<>DatePart(mm,Date+2) then 1 else 0 end from CTE Where Date<@End ) Select * from CTE where [Last]=1 OPTION ( MAXRECURSION 0 )
-
==============================
2.
DECLARE @tmpTable table (LastDates DATE); DECLARE @startDate DATE = '01/01/2012'; --1 Jan 2012 DECLARE @endDate DATE = '05/31/2012'; --31 May 2012 DECLARE @tmpEndDate DATE; SET @startDate = DATEADD(s,-1,DATEADD(mm, DATEDIFF(m,0,@startDate)+1,1)); SET @tmpEndDate = DATEADD(DAY, 1, @endDate); WHILE (@startDate <= @tmpEndDate) BEGIN INSERT INTO @tmpTable (LastDates) values (DATEADD(DAY, -1, @startDate)); SET @startDate = DATEADD(MONTH, 1, @startDate); END SELECT [LastDates] FROM @tmpTable;
산출:
예 : 1
@startDate DATE = '01/01/2012'; --1 Jan 2012 @endDate DATE = '05/31/2012'; --31 May 2012 LastDates ---------- 2012-01-31 2012-02-29 2012-03-31 2012-04-30 2012-05-31
예 : 2
@startDate DATE = '11/01/2011'; --1 Nov 2011 @endDate DATE = '03/13/2012'; --13 Mar 2012 LastDates ---------- 2011-11-30 2011-12-31 2012-01-31 2012-02-29
-
==============================
3.나는 테이블 변수를 만든 @StartDate 및 @endDate 사이의 모든 일에 그것을 가득 달에 최대 날짜를 검색.
나는 테이블 변수를 만든 @StartDate 및 @endDate 사이의 모든 일에 그것을 가득 달에 최대 날짜를 검색.
declare @tmpTable table (dates date) declare @startDate date = '08/08/2013' declare @endDate date = '11/11/2013' while @startDate <= @endDate begin insert into @tmpTable (dates) values (@startDate) set @startDate = DATEADD(DAY, 1, @startDate) end select max(dates) as [Last day] from @tmpTable as o group by datepart(YEAR, dates), datepart(MONTH, dates)
결과 :
Last day 2013-08-31 2013-09-30 2013-10-31 2013-11-11
이 루프 전에 사용할 수있는 11 월 마지막 날을 얻으려면 :
set @endDate = DATEADD(day, -1, DATEADD(month, DATEDIFF(month, 0, @endDate) + 1, 0))
-
==============================
4.스크립트에 이어, 이전 현재와 다음 달의 마지막 날을 찾을 수있는 스크립트를 보여줍니다.
스크립트에 이어, 이전 현재와 다음 달의 마지막 날을 찾을 수있는 스크립트를 보여줍니다.
----Last Day of Previous Month SELECT DATEADD(s,-1,DATEADD(mm, DATEDIFF(m,0,GETDATE()),0)) LastDay_PreviousMonth ----Last Day of Current Month SELECT DATEADD(s,-1,DATEADD(mm, DATEDIFF(m,0,GETDATE())+1,0)) LastDay_CurrentMonth ----Last Day of Next Month SELECT DATEADD(s,-1,DATEADD(mm, DATEDIFF(m,0,GETDATE())+2,0)) LastDay_NextMonth
당신은 스크립트 다음 어떤 일 지정된 사용의 달의 마지막 날을 찾으려면.
--Last Day of Any Month and Year DECLARE @dtDate DATETIME SET @dtDate = '8/18/2007' SELECT DATEADD(s,-1,DATEADD(mm, DATEDIFF(m,0,@dtDate)+1,0)) LastDay_AnyMonth ResultSet: LastDay_AnyMonth
소스 - SQL Server 중앙.
-
==============================
5.당신은이 작업을 수행 MAXRECURSION 옵션 방지를 무한 루프를주의하는 재귀 CTE를 사용할 수 있습니다 :
당신은이 작업을 수행 MAXRECURSION 옵션 방지를 무한 루프를주의하는 재귀 CTE를 사용할 수 있습니다 :
DECLARE @StartDate DATE = '2013-08-08' DECLARE @EndDate DATE = '2013-11-11' ;WITH dateCTE AS ( SELECT CAST(DATEADD(M, 1,DATEADD(d, DAY(@StartDate) * -1, @StartDate)) AS DATE) EndOFMonth UNION ALL SELECT CAST(DATEADD(M, 2,DATEADD(d, DAY(EndOFMonth) * -1, EndOFMonth)) AS DATE) FROM dateCTE WHERE EndOFMonth < DATEADD(d, DAY(@EndDate) * -1, @EndDate) ) SELECT * FROM dateCTE OPTION (MAXRECURSION 30);
이 반환
EndOFMonth ---------- 2013-08-31 2013-09-30 2013-10-31
-
==============================
6.이 시도 마지막 행은 () 날짜 필터링을위한 선택 사항입니다
이 시도 마지막 행은 () 날짜 필터링을위한 선택 사항입니다
declare @table table ( thisdate date ) insert into @table values ('12/01/2013'),('05/06/2013'),('04/29/2013'),('02/20/2013') select *,DATEADD(s,-1,DATEADD(mm, DATEDIFF(m,0,thisdate)+1,0)) LastDay from @table where thisdate between 'givendate' and 'givendate'
아래의 예는 모든 날짜입니다
thisdate lastday 2013-12-01 2013-12-31 23:59:59.000 2013-05-06 2013-05-31 23:59:59.000 2013-04-29 2013-04-30 23:59:59.000 2013-02-20 2013-02-28 23:59:59.000
-
==============================
7.다음 CTE는 당신에게 (내 컴퓨터)에 26 세기 중반까지 년 2 월 1900 매월 마지막 날을 제공합니다 :
다음 CTE는 당신에게 (내 컴퓨터)에 26 세기 중반까지 년 2 월 1900 매월 마지막 날을 제공합니다 :
;with LastDaysOfMonths as ( select DATEADD(month, ROW_NUMBER() OVER (ORDER BY so.object_id), '19000131') as Dt from sys.objects so,sys.objects so1 ) select * from LastDaysOfMonths
더 큰 쿼리의 일부로 사용하거나 원하는 단지 날짜에 그것을 아래로 필터링 쉽게 충분합니다. IS를 수행 할 일정 19000131.에게 유일한 중요한 것은 변화의 필요에 따라 당신은 당신이 그것에서 31 일이 항상 일정이 하루에 31 일이 한 달을 사용하는지 확인을 년의 범위를 조정할 수 있습니다.
-
==============================
8.필요가 같은 공통 테이블 표현식 또는 아무것도 사용하지합니다 -이 간단한 쿼리가 그것을 할 것입니다 :
필요가 같은 공통 테이블 표현식 또는 아무것도 사용하지합니다 -이 간단한 쿼리가 그것을 할 것입니다 :
SELECT DATEADD(d, -1, DATEADD(mm, DATEDIFF(m, 0, DATEADD(m, number, '2013-08-08')) + 1, 0)) AS EndOfMonth FROM master.dbo.spt_values WHERE 'P' = type AND DATEADD(m, number, '2013-08-08') < '2013-11-11';
-
==============================
9.문제는 @bummi 이미 응답 한 마지막 날에 대해이지만.
문제는 @bummi 이미 응답 한 마지막 날에 대해이지만.
그러나 여기 누군가를 위해 도움이 될 수있는 첫 데이트를위한 솔루션입니다.
@FromDate와 @ToDate 사이에 모두 달의 첫 번째 날짜를 가져옵니다.
DECLARE @FromDate DATETIME = '2019-08-13' DECLARE @ToDate DATETIME = '2019-11-25' ;WITH CTE AS ( SELECT DATEADD(DAY, -(DAY(@FromDate) - 1), @FromDate) AS FirstDateOfMonth UNION ALL SELECT DATEADD(MONTH, 1, FirstDateOfMonth) FROM CTE WHERE FirstDateOfMonth < DATEADD(DAY, -(DAY(@ToDate) - 1), @ToDate) ) SELECT * FROM CTE
다음은 결과입니다
--Result 2019-08-01 00:00:00.000 2019-09-01 00:00:00.000 2019-10-01 00:00:00.000 2019-11-01 00:00:00.000
from https://stackoverflow.com/questions/18869223/tsql-how-to-retrieve-the-last-date-of-each-month-between-given-date-range by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] 자바 : 왜 ResultSet의 직렬화하지? (0) | 2020.07.15 |
---|---|
[SQL] 고유 식별자로 조회 결과의 행을 결합? (0) | 2020.07.15 |
[SQL] 전체는 MS 액세스에 가입 (0) | 2020.07.15 |
[SQL] 어떻게 하루에 1 개 이상의 레코드를 선택하려면? (0) | 2020.07.15 |
[SQL] 5 세트로 그룹 행 (0) | 2020.07.15 |