从2日算起约会

时间:2017-01-26 10:54:20

标签: sql-server tsql datediff

我有2个日期时间字段,NEW_EMPLOYMENT_STARTDATENEW_EMPLOYMENT_ENDDATE

当我使用datediff以及startdateenddate的这些值计算使用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值,所以我可以在下个月回合,从我的解决方案提供反馈先生谢谢

4 个答案:

答案 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匹配。

相关问题