一直在研究' CASE'语法和我认为我接近得到我需要的东西,但有些东西是关闭的。 SSMS并不喜欢我用CASE写我的查询的方式,我最后让自己感到困惑,所以我把下面的样本写成了一个' IF'声明,我可以表达我想要实现的目标。任何提示或提示肯定会受到赞赏。
目标是有一个日期范围的参数列表("上周","月到日"等),当选中时将传递两个值(上下日期)限制)到WHERE语句。
DECLARE @Param1 VARCHAR(20)
-- Param1 will be set when the user selects a string value, e.g. "Last Month"
DECLARE @Date1 DATE, @Date2 DATE
-- Date1 & Date2 will be the respective lower and upper date boundaries used in the WHERE statement.
IF @Param1 = 'Last Month'
THEN
SET @Date1 = CONVERT(DATE,DATEADD(dd,-DAY(GETDATE())+1,DATEADD(mm,-1,GETDATE())))
SET @Date2 = CONVERT(DATE,DATEADD(dd,-DAY(GETDATE())+1,GETDATE()))
ELSE IF @Param1 = 'Current Month'
THEN
SET @Date1 = CONVERT(DATE,DATEADD(dd,-DAY(GETDATE())+1,GETDATE()))
SET @Date2 = CONVERT(DATE,GETDATE())
ELSE
-- Default to yesterday if nothing selected by user
SET @Date1 = CONVERT(DATE,GETDATE()-1)
SET @Date2 = CONVERT(DATE,GETDATE())
END IF
答案 0 :(得分:2)
您可以使用两个case
语句执行此操作:
select @Date1 = (case when @Param1 = 'Last Month'
then CONVERT(DATE,DATEADD(dd,-DAY(GETDATE())+1,DATEADD(mm,-1,GETDATE())))
when @Param1 = 'Current Month'
then CONVERT(DATE,DATEADD(dd,-DAY(GETDATE())+1,GETDATE()))
else CONVERT(DATE,GETDATE()-1)
end);
select @Date2 = (case when @Param1 = 'Last Month'
then CONVERT(DATE,DATEADD(dd,-DAY(GETDATE())+1,GETDATE()))
when @Param1 = 'Current Month'
then CONVERT(DATE,GETDATE())
else CONVERT(DATE,GETDATE())
end);