Tsql 允许对WHERE CASE WHEN子句中检查的列进行不同转换的多个事例

Tsql 允许对WHERE CASE WHEN子句中检查的列进行不同转换的多个事例,tsql,where,Tsql,Where,因此,我有一个日期列,我将其转换为varchar,但我想根据@SortOrder将其转换为不同的长度,最好的解决方案是什么?使用类似于而不是=: 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'

因此,我有一个日期列,我将其转换为varchar,但我想根据@SortOrder将其转换为不同的长度,最好的解决方案是什么?

使用
类似于
而不是
=

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
另一个选项(不使用case)是:

还有另一个选项,它适用于2012或更高版本,而且有点复杂,但如果您在
[Date]
列上有索引,则SQL Server可以使用它:

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()))
DECLARE@Date=GETDATE()
声明@ThisMonth date=DATEFROMPARTS(年(@date),月(@date),1)
声明@ThisYear date=DATEFROMPARTS(年份(@date),1,1)
选择
从…起
哪里
(@SortOrder='1'和D.[Date]=@Date)
或者(@SortOrder='2'和D.[Date]>=@thismonly和D.[Date]=@thisnear和D.[Date]

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

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))
2018-02-22 2018-02 2018 2 22


WHERE CASE中的WHERE CASE
-什么??通常最好在WHERE子句中使用AND/OR结构而不是CASE表达式。标记您正在使用的dbms。这个查询在几个方面都是特定于产品的。@jarlh它的TSQL是的,我没有想到我要尝试一下tnxI不明白为什么在
WHERE
语句中将varchar(10)与varchar(7)或varchar(4)进行比较。这些永远不会返回真值,对吗?我试图使用的是像哈哈,但仍然像不起作用,可能是因为varchars idki的长度忘记了添加%mby它会起作用让我试试,抱歉@Ааааааааааааћ很高兴帮助:-)。顺便说一句,我已经更新了我的答案和一个多选项的现场演示。如果您有一个在日期列上有索引的大表,并且您的sql server版本是2012或更高版本,我会说这是最好的选择。很好,我不知道DATEFROMPARTS存在,我喜欢它,并且可能有一天会使用它,谢谢!但我会坚持第一个解决方案,它看起来有点好idk:Pat首先我在使用datepart,但后来我意识到我只得到了mm,我需要yyyy/mm,所以我决定使用varchar转换,但无论如何谢谢
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))
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())