Вычисление числа целых месяцев между двумя датами в SQL

От (Неофициальное) Ссылочный Wiki Python:

общедоступные имена, определенные модулем, определяются путем проверки пространства имен модуля на переменную, названную __all__; если определено, это должна быть последовательность строк, которые являются именами, определенными или импортированными тем модулем. Имена, данные в __all__, все считаются общедоступными и требуются, чтобы существовать. Если __all__ не определяется, набор общедоступных имен включает все имена, найденные в пространство имен модуля, которые не начинаются с символа подчеркивания (" _ "). __all__ должен содержать весь общедоступный API. Это предназначается, чтобы не случайно экспортировать объекты, которые не являются частью API (такого как модули библиотеки, которые импортировались и использовались в модуле).

50
задан Rafael 18 January 2016 в 04:30
поделиться

7 ответов

В исходном сообщении были некоторые ошибки ... поэтому я переписал и упаковал его как UDF.

CREATE FUNCTION FullMonthsSeparation 
(
    @DateA DATETIME,
    @DateB DATETIME
)
RETURNS INT
AS
BEGIN
    DECLARE @Result INT

    DECLARE @DateX DATETIME
    DECLARE @DateY DATETIME

    IF(@DateA < @DateB)
    BEGIN
        SET @DateX = @DateA
        SET @DateY = @DateB
    END
    ELSE
    BEGIN
        SET @DateX = @DateB
        SET @DateY = @DateA
    END

    SET @Result = (
                    SELECT 
                    CASE 
                        WHEN DATEPART(DAY, @DateX) > DATEPART(DAY, @DateY)
                        THEN DATEDIFF(MONTH, @DateX, @DateY) - 1
                        ELSE DATEDIFF(MONTH, @DateX, @DateY)
                    END
                    )

    RETURN @Result
END
GO

SELECT dbo.FullMonthsSeparation('2009-04-16', '2009-05-15') as MonthSep -- =0
SELECT dbo.FullMonthsSeparation('2009-04-16', '2009-05-16') as MonthSep -- =1
SELECT dbo.FullMonthsSeparation('2009-04-16', '2009-06-16') as MonthSep -- =2
50
ответ дан 7 November 2019 в 11:04
поделиться

Я погуглил через Интернет. И совет, который я нашел, - добавить +1 в конец.

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

Declare @Start DateTime
Declare @End DateTime

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

Select DateDiff(Month, @Start, @End + 1)
-2
ответ дан 7 November 2019 в 11:04
поделиться

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

0
ответ дан 7 November 2019 в 11:04
поделиться

Как вы определяете месяц? Технически месяц может составлять 28,29,30 или 31 день в зависимости от месяца и високосного года.

Похоже, вы рассматриваете месяц как 30 дней, поскольку в вашем примере вы не учли, что в мае 31 день, так почему не просто сделать следующее?

SELECT DATEDIFF(DAY, '2009-04-16', '2009-05-15')/30
    , DATEDIFF(DAY, '2009-04-16', '2009-05-16')/30
    , DATEDIFF(DAY, '2009-04-16', '2009-06-16')/30
3
ответ дан 7 November 2019 в 11:04
поделиться

Попробуйте:

trunc(Months_Between(date2, date1))
0
ответ дан 7 November 2019 в 11:04
поделиться
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
ответ дан 7 November 2019 в 11:04
поделиться

Это только для ORACLE , а не для SQL-Server:

months_between(to_date ('2009/05/15', 'yyyy/mm/dd'), 
               to_date ('2009/04/16', 'yyyy/mm/dd'))

И для полного месяца:

round(months_between(to_date ('2009/05/15', 'yyyy/mm/dd'), 
                     to_date ('2009/04/16', 'yyyy/mm/dd')))

Может использоваться в Oracle 8i и выше.

4
ответ дан 7 November 2019 в 11:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: