[英]Case in Where Clause using datepart
我使用視圖來生成受影響的行。 表t1
具有五列,分別為Mo,Tu,We,Th和Fr。 如果這一天不相關,則每列都有0;如果這一天不相關,則每列有1(例如1,0,1,0,1-Mo,We和Fr相關,Tu,Th不相關)。 現在,我定義天實際日期+ 1,並將在受影響的列中接收所有具有1的行。
...
WHERE
CASE SUBSTRING(DATEPART(WEEKDAY, GETDATE() + 1), 1, 2)
WHEN 'Mo' THEN t1.Mo = 1
WHEN 'Tu' THEN t1.Tu = 1
...
但這不起作用。 我怎么解決這個問題?
您需要用比較將case
返回的值分開,這是另一回事:
WHERE
1 = CASE SUBSTRING(DATEPART(WEEKDAY, GETDATE() + 1), 1, 2)
WHEN 'Mo' THEN t1.Mo
WHEN 'Tu' THEN t1.Tu
-- ...
END
帶有WEEKDAY的DATEPART返回一個INT值,該值表示一周內的當天索引。
注意:這取決於系統的文化! 看看@@ DATEFIRST
不知道您到底想要實現什么,但是您的代碼無法正常工作。 沒有INT的支持...
也許像這樣? 該查詢僅在一天中返回索引為1或2的內容...
WHERE
1=CASE DATEPART(WEEKDAY, GETDATE() + 1)
WHEN 1 THEN 1
WHEN 2 THEN 1
WHEN 3 THEN 2
END
DATEPART
返回一個數字,在WEEKDAY
情況下(默認情況下)是從1(星期日)到7(星期六)
WHERE
-- choose the relevant column
CASE DATEPART(WEEKDAY, GETDATE() + 1)
WHEN 2 THEN t1.Mo
WHEN 3 THEN t1.Tu
WHEN 4 THEN t1.We
WHEN 5 THEN t1.Th
WHEN 6 THEN t1.Fr
-- compare with the expected value
END = 1
根據MSDN ,將WEEKDAY與DATEPART一起使用將返回一個整數,而不是字符串。 您需要檢查那些整數值,而不是調用子字符串並檢查諸如“ Mo”,“ Tu”之類的內容
這是一個簡單的例子。 還要注意,根據設置(再次查看MSDN文章),一周的第一天可能會有所不同。 下面我假設第一天是星期天。
SELECT CASE DATEPART(WEEKDAY, GETDATE() + 1)
WHEN 1 THEN 'Sunday'
WHEN 2 THEN 'Monday'
ELSE 'Other days' END
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.