복붙노트

[SQL] TSQL : 어떻게 주어진 날짜 범위 사이의 각 달의 마지막 날짜를 검색

SQL

TSQL : 어떻게 주어진 날짜 범위 사이의 각 달의 마지막 날짜를 검색

나는 예를 2013년 8월 8일 및 2013년 11월 11일 두 날짜를 가지고 있고 개별적으로 그 날짜를 선택하기 위해 테이블을 반복 할 수 있도록 나는 테이블 8 월에서 11 월부터 매월 마지막 날짜가 필요합니다.

나는 어떤 달 마지막 날짜를 선택하는 방법을 알고하지만 난 날짜 범위에 붙어입니다.

친절하게 도움이, 그것은 높게 평가 될 것입니다.

참고 : 나는 SQL 2008을 사용하고 있습니다 및 기간을 1 개월 2 개월 6개월 또는 너무 년 또는 최대 수 ...

해결법

  1. ==============================

    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. ==============================

    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. ==============================

    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. ==============================

    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. ==============================

    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. ==============================

    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. ==============================

    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. ==============================

    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. ==============================

    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
    
  10. 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