2015-10-15 39 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