2013-12-19 118 views
1

请参阅下面的示例,并请让我知道您的想法。sql server中两个日期之间的月份差异

declare @EmployeeStartDate datetime='01-Sep-2013' 
declare @EmployeeEndDate datetime='15-Nov-2013' 
select DateDiff(mm,@EmployeeStartDate, DateAdd(mm, 1,@EmployeeEndDate)) 

输出= 3 预期输出= 2.5

因为我只有15天月,所以我应该得到0.5为十一月

+1

你错过放置'dd',而不是'MM' –

+0

如果@EmployeeEndDate日期时间= '08 -nov-2013' 会是怎样的结果预期? – user3014966

+0

它应该是2.2 .... 11月8日(8/30 = 0.2) – Jeswanth

回答

6

试试这个

SELECT CASE WHEN DATEDIFF(d,'2013-09-01', '2013-11-15')>30 THEN DATEDIFF(d,'2013-09-01', '2013-11-15')/30.0 ELSE 0 END AS 'MonthDifference' 

OR

SELECT DATEDIFF(DAY, '2013-09-01', '2013-11-15')/30.436875E 
+0

你有没有试过? –

1

则DateDiff指定工作列的值进行比较除了这两个日期并且给你一个确切的区别外。你已经告诉它比较月份值,所以它看起来就是这样。

http://technet.microsoft.com/en-us/library/ms189794.aspx

TechNet文章详细介绍了DateDiff函数的返回值 - 注意,这只是INT。

如果你想要的值是一个确切的数字(或nearabouts),你应该在日期的日期,然后除以30.为整齐,我也四舍五入到一个小数位。

select Round(Convert(decimal, DateDiff(dd,@EmployeeStartDate, @EmployeeEndDate))/30, 1) 
+0

你可以请让我怎么得到2.5个月作为输出... – Jeswanth

+1

你可以有一个使用datediff(dd,....)/30 –

+0

@GiacomoDegliEsposti谢谢,是的,我正在写这篇文章,就像你评论的那样。伟大的思想...... –

1

在这里你去:

declare @EmployeeStartDate datetime='01-Sep-2013' 
declare @EmployeeEndDate datetime='15-Nov-2013' 

;WITH cDayDiff AS 
(
    select DateDiff(dd,@EmployeeStartDate, DateAdd(dd, 1,@EmployeeEndDate)) as days 
) 
SELECT 
    CAST(days as float)/30 as Months 
FROM 
    cDayDiff 

76天相等于2.5333

输出:

Months 
============ 
2.53333333333333 
2
select CAST(DATEDIFF(MONTH, StartDate, EndDate) AS float) - 
    (DATEPART(dd,StartDate)*1.0 - 1.0)/DAY(EOMONTH(StartDate)) + 
    ((DATEPART(dd,EndDate)*1.0)/DAY(EOMONTH(EndDate)))