SQL Server WHERE子句中的CASE语句
我在整理这件事上有困难。我想看看你收到的日期的财政季度。当@ReviewPeriodQuarter=1时,我希望您收到的日期为10、11、12个月。如果@ReviewPeriodQuarter=2,则我需要您收到的日期、月份1、2、3等。SQL Server不喜欢这部分的中间部分。谢谢SQL Server WHERE子句中的CASE语句,sql,sql-server,sql-server-2012,Sql,Sql Server,Sql Server 2012,我在整理这件事上有困难。我想看看你收到的日期的财政季度。当@ReviewPeriodQuarter=1时,我希望您收到的日期为10、11、12个月。如果@ReviewPeriodQuarter=2,则我需要您收到的日期、月份1、2、3等。SQL Server不喜欢这部分的中间部分。谢谢 DECLARE @ReviewPeriodQuarter Int SELECT * FROM Table WHERE MONTH(Date_Received) = CASE
DECLARE @ReviewPeriodQuarter Int
SELECT * FROM Table
WHERE
MONTH(Date_Received) =
CASE
WHEN @ReviewPeriodQuarter = 1 THEN BETWEEN 10 AND 12
WHEN @ReviewPeriodQuarter = 2 THEN BETWEEN 1 AND 3
WHEN @ReviewPeriodQuarter = 3 THEN BETWEEN 4 AND 6
WHEN @ReviewPeriodQuarter = 4 THEN BETWEEN 7 AND 9
END
我通常会将范围移动到
选择的范围之外,然后只使用一个简单的,其中:
DECLARE@MonthStart int,
@蒙特亨德国际酒店;
选择@MonthStart=CASE@ReviewPeriodQuarter,当1时,然后选择10,
当2是1时
当3到4
当4到7
完,,
@MonthEnd=案例@ReviewPeriodQuarter当1时,则为12,
2时3分
当3到6
4点到9点
结束;
挑选*
来自dbo。[表]
其中,@MonthStart和@MonthEnd之间的月份(收到日期);
请注意,由于在的WHERE
中使用了月(收到日期)
,因此这仍然是不可取的。我必须承认,不管年份如何,在特定月份需要表中的行有点奇怪。如果这是您真正的需求,那么您最好“投资”一个日历表,您可以加入
,然后在日历表的日历月
列上有一个WHERE
;这将是可搜索的。您可以使用更多参数,如Larnu,或者使用原始方法,但进行了调整
DECLARE@ReviewPeriodQuarter INT
挑选*
从桌子上
其中月份(收到日期)介于
案例
当@ReviewPeriodQuarter=1时,则为10
当@ReviewPeriodQuarter=2时,则为1
当@ReviewPeriodQuarter=3时,则为4
当@ReviewPeriodQuarter=4时,则为7
结束
及
案例
当@ReviewPeriodQuarter=1时,则为12
当@ReviewPeriodQuarter=2时,则为3
当@ReviewPeriodQuarter=3时,则为6
当@ReviewPeriodQuarter=4时,则为9
结束
如何使用值()
或者更简单地说:
WHERE DATEPART(quarter, DATEADD(MONTH, -3, t.Date_Received)) = @ReviewPeriodQuarter
换句话说,您不需要条件逻辑来指定每个季度。您可以使用日期算术。这是一个大小写
表达式,而不是大小写
(开关
)语句;它返回一个标量值,而不是布尔结果(在本例中为1的一半)。但是,不要在WHERE
中使用大小写
表达式,坚持使用和
和或
运算符。可爱的语法,但不是。大小写
表达式不会产生布尔值,无法进行比较。你必须写(@ReviewPeriodQuarter=1和月(Date_Received)在10和12之间)或(@ReviewPeriodQuarter=2和月(Date_Received)在1和3之间)…
A用于创意,F用于执行?有很多很酷的方法可以解决这个问题。谢谢你的帮助
WHERE DATEPART(quarter, DATEADD(MONTH, -3, t.Date_Received)) = @ReviewPeriodQuarter