2015-10-15 65 views
2

我使用視圖來生成受影響的行。表t1有五個專欄,Mo,Tu,We,Th和Fr.如果這一天不相關,每列有0;如果這一天有關,每列有1(例如1,0,1,0,1 - Mo,We和Fr是相關的,Tu,Th不相關)。現在我定義日期實際日期+ 1,並將接收受影響列中所有具有1的行。使用datepart的Where子句中的情況

... 
WHERE 
CASE SUBSTRING(DATEPART(WEEKDAY, GETDATE() + 1), 1, 2) 
WHEN 'Mo' THEN t1.Mo = 1 
WHEN 'Tu' THEN t1.Tu = 1 
... 

但這不起作用。我怎麼解決這個問題?

+0

您不能將值賦給位於「WHERE」子句中的「CASE」語句中的列。 –

回答

1

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 
2

您需要的case與收益的比較,這是一個不同的東西分開值:

WHERE 
1 = CASE SUBSTRING(DATEPART(WEEKDAY, GETDATE() + 1), 1, 2) 
     WHEN 'Mo' THEN t1.Mo 
     WHEN 'Tu' THEN t1.Tu 
     -- ... 
    END 
+0

'SELECT SUBSTRING(DATEPART(WEEKDAY,GETDATE()+ 1),1,2)'不能工作。 WEEKDAY返回INT ... – Shnugo

0

MSDN,使用WEEKDAY與DATEPART會返回一個整數,而不是字符串。您需要檢查這些整數值,而不是調用子字符串並檢查'Mo','Tu'等事物。

下面是一個簡單示例。另請注意,根據設置(再次查看MSDN文章),一週的第一天可能會有所不同。下面我假設第1天是星期天。

SELECT CASE DATEPART(WEEKDAY, GETDATE() + 1) 
    WHEN 1 THEN 'Sunday' 
    WHEN 2 THEN 'Monday' 
    ELSE 'Other days' END 
1

帶WEEKDAY的DATEPART返回INT值,表示當天的指數在一週內。

要小心:這取決於系統的文化!看看@@ DATEFIRST

不知道你到底想要達到什麼,但是你的代碼無法工作。沒有INT的SUBSTRING ...

也許是這樣的?這個查詢只能在索引1或2天返回的東西...

WHERE 
1=CASE DATEPART(WEEKDAY, GETDATE() + 1) 
WHEN 1 THEN 1 
WHEN 2 THEN 1 
WHEN 3 THEN 2 
END 
+0

對不起 - 這是我的錯 - 然後聲明是 SUBSTRING(DATENAME(WEEKDAY,GETDATE()+ 1),1,2) – Chris

+1

@Chris,好吧,用DATENAME你可以這樣做,但我不會。這很大程度上取決於您系統的文化。更好地使用INT函數DATEPART並使用@@ DATEFIRST來獲得獨立於系統的解決方案。你需要更多的幫助,還是現有的答案能解決你的問題? – Shnugo

+0

我解決了它 - 感謝所有 – Chris