簡體   English   中英

子句使用datepart的情況

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM