SQL Server:日期自动化TSQL查询

时间:2017-01-03 11:13:45

标签: sql sql-server tsql date datetime

我希望SQL查询自动获取日期,

请注意:年份应始终从 1月的最后一个星期日开始。

我想在下面举例说明一个SQL查询;假设当前日期为2017-01-01'

SQL应该选择这些日期:

Between '2016-01-31' and '2016-12-31'

(年初之间(1月份的最后一个星期日)'以及'前一周的最后一天(星期六)')

我有这个问题:

Between 
    case 
       When DatePart(w, DateAdd(d, 30, DATEADD(y, - DatePart(y, GetDate()) + 1, GetDate()))) = 1
          Then DateAdd(d, 30, DATEADD(y, - DatePart(y, GetDate()) + 1, convert(date, GetDate())))
          Else DateAdd(d, 7 - DatePart(w, DateAdd(d, 30, DATEADD(y, - DatePart(y, GetDate()) + 1, GetDate()))) + 1, DateAdd(d, 30, DATEADD(y, - DatePart(y, GetDate()) + 1, convert(date, GetDate())))
                )
       end
and 
    convert(date, dateadd(wk, datediff(wk, 0, getdate()) - 1, 0) + 5) 

以上查询返回错误结果:

示例1 错误

假设当前日期是' 2017-01-01',SQL查询返回这些日期:

Between '2017-02-05' and '2016-12-31'

这是错误的。

示例2 更正

假设当前日期为' 2017-02-12',然后SQL查询返回这些日期:

Between '2017-02-05' and '2017-02-11'

这是正确的日期 - 好的。

  

问题始终是当前日期是一月份

如何修复示例1 ?任何更新的SQL查询?

1 个答案:

答案 0 :(得分:1)

如果任何一年的2月是您的固定参数,那么您将当前日期与它进行比较,并根据结果使用与否:

    DECLARE @GetMyDate datetime = '2017-01-01'--GETDATE()

    SELECT  @GetMyDate,
            CASE 
                WHEN    @GetMyDate < DATEADD(Day,-1,CONVERT(datetime, CONVERT(varchar(4), (year(@GetMyDate))) + '-02-01'))
                THEN    DATEADD(Day,-1,CONVERT(datetime, CONVERT(varchar(4), (year(@GetMyDate)-1)) + '-02-01'))
                ELSE    DateAdd(d, 7 - DatePart(w, DateAdd(d, 30, DATEADD(y, - DatePart(y, @GetMyDate) + 1, @GetMyDate))) + 1, DateAdd(d, 30, DATEADD(y, - DatePart(y, @GetMyDate) + 1, convert(date, @GetMyDate))))
            END AS StartDate,
            convert(date, dateadd(wk, datediff(wk, 0, @GetMyDate) - 1, 0) + 5)  AS EndDate

更新

BETWEEN CASE 
            WHEN    GETDATE() <= DATEADD(Day,-0,CONVERT(datetime, CONVERT(varchar(4), (year(GETDATE()))) + '-02-01'))
            THEN    DATEADD(Day,-0,CONVERT(datetime, CONVERT(varchar(4), (year(GETDATE())-1)) + '-02-01'))
            ELSE    DateAdd(d, 7 - DatePart(w, DateAdd(d, 30, DATEADD(y, - DatePart(y, GETDATE()) + 1, GETDATE()))) + 1, DateAdd(d, 30, DATEADD(y, - DatePart(y, GETDATE()) + 1, convert(date, GETDATE()))))
        END 
        AND
        CASE 
            WHEN    GETDATE() = DATEADD(Day,-0,CONVERT(datetime, CONVERT(varchar(4), (year(GETDATE()))) + '-02-01'))
            THEN    DATEADD(Day,-1,CONVERT(datetime, CONVERT(varchar(4), (year(GETDATE()))) + '-02-01'))
            ELSE    Convert(date, dateadd(wk, datediff(wk, 0, GETDATE()) - 1, 0) + 5)
        END