2015-12-24 4 views
1

У меня есть сценарий, который я хочу извлечь значения из db соответственно с некоторыми датами.SQL Server: аргумент WHERE между

У меня есть функция, которая возвращает дату, эта дата может быть currentDate - 1 месяц или может быть curentDate -2 месяца. Функция

set @syssDate = DATEADD(month, -1, @syss_date); 

и я объявил дату начала:

declare @start_quarter datetime 
set @start_quarter = '2015-07-01'; 

Все, что я хочу в моей статье WHERE, чтобы добавить

case 
    when syssDate = start_quarter 
     then bu.date between '2015-01-01' and '2015-10-01' 
     else -- another date 

Мой запрос выглядит следующим образом:

declare @start_quarter datetime 
    set @start_quarter = '2015-01-01'; 

    declare @actual_Date datetime 
    set @actual_Date = DATEADD(month, -1, @rollover_date); 


     select sum(t.Revenue) as Revenue from (
      select sum(bu.value) as Revenue 
        from bus_category_for bu 
         join bus_category buc on buc.id=bu.bus_category_id 
         join bus bu on bu.id=buc.bus_id 
        where buc.type_id=18 and bu.id=21 and 
--Here I want to add a case statement 
bu.date between '2015-01-01' and '2015-10-01' 
+0

'CASE' в T-SQL является ** выражением ** (например,' a + b'), которое может возвращать ** одно., Атомное значение ** - это ** NOT ** инструкция управления потоком, поэтому у вас не может быть целых блоков кода внутри него. –

+0

И как его решить? Как я могу использовать инструкцию 'case' ??? –

+2

Это нехорошая ситуация для 'CASE' - вам придется иметь ** два **' CASE' выражения - одно для первой даты и еще одно второе число в вашей 'BETWEEN' .... лучше использовать одно из решений, предоставленных теми, кто уже ответил –

ответ

2

Я полагаю, mething как этот

SELECT Sum(t.Revenue) AS Revenue 
FROM (SELECT Sum(bu.value) AS Revenue 
     FROM bus_category_for bu 
       JOIN bus_category buc 
       ON buc.id = bu.bus_category_id 
       JOIN bus bu 
       ON bu.id = buc.bus_id 
     WHERE buc.type_id = 18 
       AND bu.id = 21 
       AND ((@syssDate = @start_quarter 
         AND bu.date BETWEEN '2015-01-01' AND '2015-10-01') 
         OR (another date)))a 
+0

Спасибо, дорогой VR46, все работает ..... –

2

Попробуйте что-то вроде

WHERE (syssDate = start_quarter AND bu.date between '2015-01-01' and '2015-10-01') 
    OR (yssDate <> start_quarter AND bu.date between '2016-01-01' and '2016-10-01') 

Вообще, желательно не использовать between дат. Лучше использовать bu.date >= '2015-01-01' AND bu.date < '2015-10-02'. См. here.

+1

Совет на самом деле должен использовать '<' для второго сравнения, а не '<='. Using '> =' и '<=' точно эквивалентен 'BETWEEN'. –

+0

@Damien_The_Unbeliever, спасибо за исправление, набрал текст, чтобы быстро ... Отредактировано для исправления. – HoneyBadger

+0

Я скажу, что 'между' работает так, как должно. Его непонимание и неправильное восприятие –

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