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将它转换为不同的长度,什么是最好的解决方案?
使用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))
如果你想比较年,月和日,有更好的方法
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