我希望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查询?
答案 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