Значения, которые вы получаете, имеют смысл.DATEDIFF
считает тики между 2 датами, где тик - это значение первого параметра.Так, например: DATEDIFF(MONTH, '20180101','20180228')
вернет 1, поскольку произошел только 1 тик (2 - 1 = 1
).Кажется, здесь вам просто нужно добавить 1:
DECLARE @CY_StartDate date =CAST(DATEADD(MONTH, DATEDIFF(MONTH, -1, GETDATE())-13, 0) AS DATE),
@CY_EndDate date =CAST(DATEADD(MONTH, DATEDIFF(MONTH, -1, GETDATE())-1, -1) AS DATE); --- Rolling 12 months
DECLARE @PY_startDate date =DATEADD(YEAR,-1,@CY_StartDate),
@PY_EndDate date =DATEADD(YEAR,-1,@CY_EndDate)
select
@CY_StartDate as CY_Start,
@CY_EndDate AS CY_End,
@PY_StartDate AS PY_Start,
@PY_EndDate AS PY_End,
DATEDIFF(year,@CY_StartDate,DATEADD(DAY,1,@CY_EndDate)) as yr,
DATEDIFF(month,@CY_StartDate,DATEADD(DAY,1,@CY_EndDate)) as month,
DATEDIFF(day,@CY_StartDate,DATEADD(DAY,1,@CY_EndDate)) as day
Причина, по которой я использовал еще DATEADD
, заключается в том, что это делает его совместимым с каждым выражением.Значение yr
было правильным, однако для таких дат, как 20170101
и 20171231
, значение yr
будет 0
.Следовательно, добавление 1 дня к значению @CY_EndDate
делает это намного более надежным, если даты сдвигаются.