我有2个日期时间字段,NEW_EMPLOYMENT_STARTDATE
和NEW_EMPLOYMENT_ENDDATE
当我使用datediff
以及startdate
和enddate
的这些值计算使用NEW_EMPLOYMENT_STARTDATE = 2017-15-01
NEW_EMPLOYMENT_ENDDATE = 2018-14-01
的月份差异时:
DATEDIFF(MONTH, NEW_EMPLOYMENT_STARTDATE, NEW_EMPLOYMENT_ENDDATE)
使用此查询:
NEW_EMPLOYMENT_STARTDATE = 2017-01-01
NEW_EMPLOYMENT_ENDDATE = 2017-31-12
它返回12个月,但是当我有这样的值时:
DATEDIFF(MONTH, NEW_EMPLOYMENT_STARTDATE, NEW_EMPLOYMENT_ENDDATE)-
CASE
WHEN DATEPART(DAY, NEW_EMPLOYMENT_ENDDATE) > DATEPART(DAY, NEW_EMPLOYMENT_STARTDATE)
THEN 0
ELSE 0 END AS MONTH_DIFF
它返回11个月。
我怎样才能获得12个月?我正在使用此查询:
CASE
WHEN DATEPART(DAY, NEW_EMPLOYMENT_ENDDATE) > DATEPART(DAY, NEW_EMPLOYMENT_STARTDATE)
THEN DATEDIFF(MONTH, NEW_EMPLOYMENT_STARTDATE, NEW_EMPLOYMENT_ENDDATE)+1
ELSE DATEDIFF(MONTH, NEW_EMPLOYMENT_STARTDATE, NEW_EMPLOYMENT_ENDDATE)
END AS DATEDIF
它仍然会回归11个月。
编辑:
根据我的情况,结束日期的值总是比开始日期少1天,所以我做了一个技巧来检查条件,如下所示:
foreach($data as $item) {
echo $item['user_group_id'];
}
我在结束日期加上+ 1值,所以我可以在下个月回合,从我的解决方案提供反馈先生谢谢
答案 0 :(得分:1)
您的期望不正确。当您使用DATEDIFF
执行MONTH
时,它不会考虑日期的日期部分。考虑到它只是考虑月份数的差异,无论指定的日期如何。
此查询:
SELECT DATEDIFF(MONTH, '20170101', '20171231') MonthsDiff
等同于:
SELECT DATEPART(MONTH, '20171231') - DATEPART(MONTH, '20170101') MonthsDiff
DATEDIFF 的文档说明:
DATEDIFF(datepart,startdate,enddate)
第一个选项是DATEPART
:
日期部分 startdate和enddate的一部分是指定交叉边界的类型。
如果您想要更接近预期的东西,您可以根据以天为单位执行DATEDIFF
进行简单计算,将其除以一个月内的大致天数。
SELECT DATEDIFF(DAY, '20170101', '20171231') / ( 365 / 12 ) MonthsDiff
这会将输出四舍五入到最接近的月份数,这取决于您想要的准确度。如果您希望将月份作为小数点以获得更高的准确度,请运行以下命令:
SELECT DATEDIFF(DAY, '20170101', '20171220') / ( 365.00 / 12 ) MonthsDiff
注意:对于可能包含闰年的较大日期范围,这并未考虑闰年,这会对准确性产生细微差别。
答案 1 :(得分:0)
NEW_EMPLOYMENT_STARTDATE = '2017-01-02' (YYYY-MM-DD is standard format)
NEW_EMPLOYMENT_ENDDATE = '2018-01-01'
做了非常特别的事情。它计算"边界的数量"两个日期/时间值之间。在您的情况下,有十一个边界 - 在十二月之前的一年中每个月一个。
此行为不一定直观。如果您在每个日期添加一天:
DATEDIFF(MONTH,
DATEADD(DAY, 1 - DAY(NEW_EMPLOYMENT_STARTDATE), NEW_EMPLOYMENT_STARTDATE)
DATEADD(DAY, 15 + 1 - DAY(NEW_EMPLOYMENT_STARTDATE), NEW_EMPLOYMENT_ENDDATE)
)
然后你将有12个月。
如果你想要整理,你可以玩日期。一种方法是将第一个值标准化为月初,然后将第二个值添加到第二个值:
{{1}}
这适用于您提供的两个示例。
答案 2 :(得分:0)
请使用此选项以达到您想要的效果。您可以使用表列而不是变量:
declare @new_employment_startdate datetime = convert (datetime, '2017-01-01', 121);
declare @new_employment_enddate datetime = convert (datetime, '2018-01-14', 121);
select
datediff(month, @new_employment_startdate, @new_employment_enddate)
+ case when
datediff(month, dateadd(ms, -3, dateadd(dd, datediff(dd, 0, @new_employment_startdate), 0)), @new_employment_startdate) = 1
and datediff(month,@new_employment_enddate , dateadd(dd, datediff(dd, 0, @new_employment_enddate) + 1, 0)) = 1
then 1
else 0
end;
一些解释: 我检查或开始日期是第一个月日,结束日期是上个月日。在这种情况下,我按月向标准日期加上+1。
您可以使用以下示例查询更好地了解我使用的日期时间操作:https://gist.github.com/runnerlt/60636b029ab47845fdfd8924ed482e61
答案 3 :(得分:-1)
您需要在结束日期再添加1天。 DATEDIFF(月,NEW_EMPLOYMENT_START日期,DATEADD(DD,1,NEW_EMPLOYMENT_ENDDATE))
您可以将输出与MS Excel匹配。