的SQL Server:日期自动TSQL查询
我想SQL查询来自动获取的日期,的SQL Server:日期自动TSQL查询
请注意:今年应该总是开始一月最后一个星期日。
我想要一个SQL查询下面的例子;假定当前日期是“2017年1月1日”
SQL应该选择这些日期:
Between '2016-01-31' and '2016-12-31'
(间“年度开始(去年一月月的星期日)”和“最后一天(周六)此前一周的)
的我有这个疑问:
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年1月1日',SQL查询返回这些日期:
Between '2017-02-05' and '2016-12-31'
这是错误的。
例2:正确
假定当前日期是 '2017年2月12日',那么SQL查询返回这些日期:
Between '2017-02-05' and '2017-02-11'
这是正确的日期 - 确定。
问题始终是在当前日期是在一月
如何修复例如1,请?任何更新的SQL查询?
如果任何一年的二月是那么你的固定参数,你当前的日期进行比较,并根据其结果使用与否:
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
之间'我不确定你是否真的有以下几点:'2016-12-31'和'2017-01之间-31' –
谢谢。我不想手动输入当前日期。它想要自己挑选。 – user2331670
将变量替换为getdate() –
哪个版本的SQL服务器正在运行?如果至少在2012年,[EOMONTH](https://msdn.microsoft.com/en-us/library/hh213020.aspx)函数可能对您有用! – Bridge
@bridge,SQL Server 2014 – user2331670
您提到的年份应该始终在2月1日开始,那么您将如何在'2017-01-01'之间获得'2016-01-31'和'2016-12-31'之间' ,我认为应该是'2016年2月7日'和'2016年12月31日' –