2016-07-26 3 views
0

Я пытаюсь написать предложение WHERE, чтобы оглянуться назад 3 дня, когда день недели - понедельник, присоединившись к таблице календаря.Заявление CASE с датами в WHERE Статья

WHERE   
CASE WHEN calendar.DW = 2 Then (date_created BETWEEN DATEADD(hour,8,DATEDIFF(d,0,GETDATE()-3)) 
      AND GETDATE() ELSE 
     date_created BETWEEN DATEADD(hour,8,DATEDIFF(d,0,GETDATE()-1)) 
      AND GETDATE() 
      END 

Я получаю сообщение об ошибке оператора «МЕЖДУ» для вышеуказанного. Можно ли делать то, что я пытаюсь, или я об этом неправильно?

Спасибо за помощь.

+0

Пожалуйста, измените свой вопрос и добавить тег для конкретной базы данных, с которой вы работаете. 'sql' может быть любым количеством вещей ... MySQL, MS-SQL, Oracle .. –

+1

определенно НЕ mysql. dateiff там принимает только 2 аргумента, и 'getdate()' тоже не существует. –

+0

@MarcB - вопрос должен по-прежнему иметь соответствующий тег, поэтому нам не нужно гадать. –

ответ

0

Вам нужно добавить условие, которое может быть оценена в true или false, например, так:

WHERE   
(CASE WHEN calendar.DW = 2 AND date_created BETWEEN DATEADD(hour,8,DATEDIFF(d,0,GETDATE()-3)) 
      AND GETDATE() THEN 1 WHEN 
     date_created BETWEEN DATEADD(hour,8,DATEDIFF(d,0,GETDATE()-1)) 
      AND GETDATE() THEN 1 ELSE 0 
      END) = 1 
0

Вы можете попробовать простой, где пункт:

WHERE calendar.DW = 2 AND 
     date_created BETWEEN DATEADD(hour,8,DATEDIFF(d,0,GETDATE()-3) 
      AND GETDATE() 
     OR 
     date_created BETWEEN DATEADD(hour,8,DATEDIFF(d,0,GETDATE()-1)) 
      AND GETDATE() 
+0

вам нужны скобки вокруг ваших предложений 'OR', потому что первый содержит' AND' –

+0

Например: 'SELECT 1 WHERE 1 = 0 AND 1 = 0 ИЛИ 0 <1' вернет 1, а' SELECT 1 ГДЕ 1 = 0 AND (1 = 0 ИЛИ 0 <1) 'не будет. Как минимум, правильная практика должна быть явной в группировке условий. –

Смежные вопросы