代码之家  ›  专栏  ›  技术社区  ›  JonWay

SQL Server参数日期范围问题

  •  0
  • JonWay  · 技术社区  · 6 年前

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

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

    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, @CY_EndDate) AS yr,
            DATEDIFF(month, @CY_StartDate, @CY_EndDate) AS month,
            DATEDIFF(day, @CY_StartDate, @CY_EndDate) AS day
    

    电流输出

    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
    
    2 回复  |  直到 6 年前
        1
  •  3
  •   Thom A    6 年前

    你得到的价值观是有意义的。 DATEDIFF 计算两个日期之间的刻度,其中刻度是第一个参数的值。例如: DATEDIFF(MONTH, '20180101','20180228') 将返回1,因为只出现了1个记号( 2 - 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 ,的值 会是 0 . 因此,将 @CY_EndDate 如果日期发生变化,这会使它更加可靠。

        2
  •  2
  •   Salman Arshad    6 年前

    常识。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。

    [2017-10-01, 2018-10-01) DATEDIFF