От (Неофициальное) Ссылочный Wiki Python:
общедоступные имена, определенные модулем, определяются путем проверки пространства имен модуля на переменную, названную
__all__
; если определено, это должна быть последовательность строк, которые являются именами, определенными или импортированными тем модулем. Имена, данные в__all__
, все считаются общедоступными и требуются, чтобы существовать. Если__all__
не определяется, набор общедоступных имен включает все имена, найденные в пространство имен модуля, которые не начинаются с символа подчеркивания (" _ ").__all__
должен содержать весь общедоступный API. Это предназначается, чтобы не случайно экспортировать объекты, которые не являются частью API (такого как модули библиотеки, которые импортировались и использовались в модуле).
В исходном сообщении были некоторые ошибки ... поэтому я переписал и упаковал его как 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
Я погуглил через Интернет. И совет, который я нашел, - добавить +1 в конец.
Попробуйте сделать это так:
Declare @Start DateTime
Declare @End DateTime
Set @Start = '11/1/07'
Set @End = '2/29/08'
Select DateDiff(Month, @Start, @End + 1)
DATEDIFF () предназначена для возврата числовых границ, пересеченных между двумя датами для указанного диапазона. Чтобы заставить его делать то, что вы хотите, вам нужно сделать дополнительную настройку, чтобы учесть, когда даты пересекают границу, но не завершают полный диапазон.
Как вы определяете месяц? Технически месяц может составлять 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
SELECT 12 * (YEAR(end_date) - YEAR(start_date)) +
((MONTH(end_date) - MONTH(start_date))) +
SIGN(DAY(end_date) / DAY(start_date));
У меня это отлично работает на SQL SERVER 2000.
Это только для 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 и выше.