Вычисление количества полных месяцев между двумя датами в SQL - PullRequest
47 голосов
/ 10 июля 2009

Мне нужно рассчитать число ПОЛНЫЙ месяц в SQL, т.е.

  • 2009-04-16 - 2009-05-15 => 0 полных месяцев
  • 2009-04-16 - 2009-05-16 => 1 полный месяц
  • 2009-04-16 до 2009-06-16 => 2 полных месяца

Я пытался использовать DATEDIFF, т.е.

SELECT DATEDIFF(MONTH, '2009-04-16', '2009-05-15')

но вместо того, чтобы давать мне полные месяцы между двумя датами, он дает мне разницу в месячной части, т.е.

1

Кто-нибудь знает, как рассчитать количество полных месяцев в SQL Server?

Ответы [ 15 ]

0 голосов
/ 03 августа 2015
WITH   
-- Count how many months must be added to @StartDate to exceed @DueDate  
MONTHS_SINCE(n, [Month_hence], [IsFull], [RemainingDays] ) AS (  
SELECT   
    1 as n,  
    DATEADD(Day, -1, DATEADD(Month, 1, @StartDate)) AS Month_hence  
    ,CASE WHEN (DATEADD(Day, -1, DATEADD(Month, 1, @StartDate)) <= @LastDueDate)   
        THEN 1   
        ELSE 0   
    END  AS [IsFull]  
    ,DATEDIFF(day, @StartDate,  @LastDueDate) as [RemainingDays]  
UNION ALL  
SELECT  
    n+1,  
    --DateAdd(Month, 1, Month_hence) as Month_hence -- No, causes propagation of short month discounted days  
    DATEADD(Day, -1, DATEADD(Month, n+1, @StartDate)) as Month_hence  
    ,CASE WHEN (DATEADD(Day, -1, DATEADD(Month, n+1, @StartDate)) <= @LastDueDate)   
        THEN 1   
        ELSE 0    
    END  AS [IsFull]  
    ,DATEDIFF(day, DATEADD(Day, -1, DATEADD(Month, n, @StartDate)),  @LastDueDate)  
    FROM MONTHS_SINCE   
    WHERE Month_hence<( @LastDueDate --WHERE Period= 1  
    )  
), --SELECT * FROM MONTHS_SINCE  
MONTH_TALLY (full_months_over_all_terms, months_over_all_terms, days_in_incomplete_month ) AS (  
SELECT  
    COALESCE((SELECT MAX(n) FROM MONTHS_SINCE WHERE isFull = 1),1) as full_months_over_all_terms,  
    (SELECT MAX(n) FROM MONTHS_SINCE ) as months_over_all_terms,  
    COALESCE((SELECT [RemainingDays] FROM MONTHS_SINCE WHERE isFull = 0),0) as days_in_incomplete_month  
) SELECT * FROM MONTH_TALLY;   
0 голосов
/ 06 марта 2010
SELECT 12 * (YEAR(end_date) - YEAR(start_date)) +
    ((MONTH(end_date) - MONTH(start_date))) +
    SIGN(DAY(end_date) / DAY(start_date));

Это нормально работает для меня на SQL SERVER 2000.

0 голосов
/ 13 января 2010

Попробуйте:

trunc(Months_Between(date2, date1))
0 голосов
/ 10 июля 2009

Я гуглил по интернету. И предложение, которое я нашел, это добавить +1 к концу.

Попробуйте сделать это так:

Declare @Start DateTime
Declare @End DateTime

Set @Start = '11/1/07'
Set @End = '2/29/08'

Select DateDiff(Month, @Start, @End + 1)
0 голосов
/ 10 июля 2009

DATEDIFF () предназначен для возврата границ числа, пересекаемых между двумя датами для указанного диапазона. Чтобы заставить его делать то, что вы хотите, вам нужно сделать дополнительную корректировку, чтобы учесть, когда даты пересекают границу, но не завершают полный промежуток.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...