Sql server SQL Server参数日期范围问题

Sql server SQL Server参数日期范围问题,sql-server,tsql,sql-server-2008,datetime,Sql Server,Tsql,Sql Server 2008,Datetime,我使用下面的查询来获取两个日期之间的差异。日期范围为每12个月一次 CY代表本年,PY代表上一年。本年度的日期用于计算上一年度的日期 当我执行查询时,我有以下输出,其中月份是11,日期是364。但我希望我的月份是12个月,365天或(闰年是366天) 电流输出 CY_Start CY_End PY_Start PY_End yr month day 2017-10-01 2018-09-30 2016-10-01 2017-09-30

我使用下面的查询来获取两个日期之间的差异。日期范围为每12个月一次

CY代表本年,PY代表上一年。本年度的日期用于计算上一年度的日期

当我执行查询时,我有以下输出,其中月份是11,日期是364。但我希望我的月份是12个月,365天或(闰年是366天)

电流输出

CY_Start     CY_End         PY_Start     PY_End     yr  month   day
2017-10-01   2018-09-30     2016-10-01  2017-09-30  1   11      364
预期产量

CY_Start     CY_End         PY_Start     PY_End     yr  month   day
2017-10-01   2018-09-30     2016-10-01  2017-09-30  1   12      365

你得到的价值是有意义的
DATEDIFF
统计两个日期之间的刻度,其中刻度是第一个参数的值。因此,例如:
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
。因此,如果日期发生变化,则将
@CY_EndDate
的值加上1天会使该值更加可靠。

您得到的值有意义
DATEDIFF
统计两个日期之间的刻度,其中刻度是第一个参数的值。因此,例如:
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
。因此,如果日期发生变化,则将
@CY_EndDate
的值加上1天将使该值更加可靠。

常识。1和10之间有多少个数字,包括两者?你可能会说有10-1=9是不正确的。正确答案是(10-1)+1=10

同样,如果您有两个包含日期,例如
2017-10-01
2018-09-30
您可以将一个日期添加到
DATEDIFF(DAY,'2017-10-01','2018-09-30')
以获得365而不是364


然而,正如在另一个答案中所建议的那样,结束日期是独占的(不算在内),这使得日期计算更为直接。在你的例子中,你应该在最后一个日期加上1天,这样你就有了
[2017-10-012018-10-01)
,而
DATEDIFF
将产生所需的结果。

常识。1和10之间有多少数字,包括两者?你可能会说10-1=9是不正确的。正确答案是(10-1)+1=10

同样,如果您有两个包含日期,例如
2017-10-01
2018-09-30
您可以将一个日期添加到
DATEDIFF(DAY,'2017-10-01','2018-09-30')
以获得365而不是364

但是,正如另一个答案中所建议的,最好使用“结束日期独占”(不计算),这样可以直接计算日期。在您的示例中,您应该在最后一个日期后添加1天,这样您就有了
[2017-10-012018-10-01)
DATEDIFF
将产生期望的结果。

364是正确的回答。这两个日期之间有364天,就像“2017-10-01”和“2017-09-30”之间只有一天一样。如果你想计算差异中的开始日期,添加1364是正确的回答。有364天的时间在这两个日期之间,就像“2017-10-01”和“2017-09-30”之间只有一天一样。如果要在差异中计算开始日期,请添加1