允许在WHERE CASE WHEN子句中检查的列的不同转换的多个案例

问题描述 投票:-1回答:2
SELECT Clmn
FROM Tbl T
INNER JOIN SomeotherTbl
WHERE CONVERT(varchar(10), T.[Date], 120) = 
CASE @SortOrder 
    WHEN '1' THEN CONVERT(varchar(10), GETDATE(), 120)
    WHEN '2' THEN CONVERT(varchar(7),  GETDATE(), 120)
    WHEN '3' THEN CONVERT(varchar(4),  GETDATE(), 120)
END

所以我有一个Date列,我转换为varchar,但我想根据@SortOrder将它转换为不同的长度,什么是最好的解决方案?

tsql where
2个回答
2
投票

使用Like而不是=

WHERE CONVERT(varchar(10),D.[Date],120) LIKE 
CASE @SortOrder 
    WHEN '1' THEN CONVERT(varchar(10),GETDATE(),120)
    WHEN '2' THEN CONVERT(varchar(7),GETDATE(),120) +'%'
    WHEN '3' THEN CONVERT(varchar(4),GETDATE(),120) +'%'
END

另一种选择(不使用案例)是这样的:

WHERE (@SortOrder > '3' OR YEAR(D.[Date]) = YEAR(GETDATE()))
AND   (@SortOrder > '2' OR MONTH(D.[Date]) = MONTH(GETDATE()))
AND   (@SortOrder > '1' OR DAY(D.[Date]) = DAY(GETDATE()))

还有一个选项,适用于2012或更高版本,并且稍微复杂一点,但如果你在[Date]列上有索引将允许SQL Server使用它:

DECLARE @Date date = GETDATE()
DECLARE @ThisMonth date = DATEFROMPARTS(YEAR(@Date), MONTH(@Date), 1)
DECLARE @ThisYear date = DATEFROMPARTS(YEAR(@Date), 1, 1)

SELECT ...
FROM ...
WHERE 
    (@SortOrder = '1' AND D.[Date] = @Date)
OR  (@SortOrder = '2' AND D.[Date] >=  @ThisMonth AND D.[Date] < DATEADD(MONTH, 1, @ThisMonth))
OR  (@SortOrder = '3' AND D.[Date] >= @ThisYear AND D.[Date] < DATEADD(YEAR, 1, @ThisYear))

You can see a live demo on rextester.


0
投票

如果你想比较年,月和日,有更好的方法

select CONVERT(varchar(10), GETDATE(), 120), CONVERT(varchar(7), GETDATE(), 120), CONVERT(varchar(4), GETDATE(), 120)  
      , DATEPART(year, getdate()), DATEPART(month, getdate()),  DATEPART(day, getdate())

2018-02-22 2018-02 2018 2018 2 22

© www.soinside.com 2019 - 2024. All rights reserved.