Member 10807962 Ответов: 2

Мне нужно задать условие в предложении where на основе финансового года


пожалуйста, помогите, как я могу установить условие на основе финансового года

Select top 25 O.OCSEmployeeCode as UserID, OCSBillNo as BillNo, convert(varchar(10),OCSBillDate,103) as BillDate, Year(OCSBillDate) as mYear, DATEPART(mm,OCSBillDate) as mMonth
from  HMS_OCSBill O where OCSCancelStatus Is Null And OCSDiscontinueFlag Is Null and O.OCSEmployeeCode='GAA6725' 
AND (
CASE WHEN DATEPART(mm,getdate())<4 THEN 
((Year(OCSBillDate)=year(getdate())-1 AND DATEPART(mm,OCSBillDate)>=4)) OR ((Year(OCSBillDate)=year(getdate()) AND DATEPART(mm,OCSBillDate)<=3))
ELSE
((Year(OCSBillDate)=year(getdate()) AND DATEPART(mm,OCSBillDate)>=4)) END)
 ORDER BY Year(OCSBillDate) DESC;


Это дает мне сообщение об ошибке, что неисправный Синтекс рядом с "=".

Что я уже пробовал:

Пожалуйста, помогите, как я могу это решить..

2 Ответов

Рейтинг:
2

Patrice T

Даже без вашей проблемы ваш запрос плохо построен и будет slooow на производственном сервере, хранящем несколько лет истории.
Вы используете getdate() в when проблема в том, что функция изменчива, ее значение меняется каждый раз, когда вы ее вызываете.
Это означает, что сервер не может оптимизировать фильтр, а рабочая нагрузка зависит от количества записей в таблице. Тот факт, что вы разделываете поля даты, является еще одной причиной не оптимизировать, потому что это выходит за рамки понимания сервера.

Другой способ сделать это-вычислить начальную и конечную даты записей, которые вы хотите до то выбирать.
И затем :

when OCSBillDate between @StartDate and @EndDate

Таким образом, SQL server знает, как использовать преимущества индекса, и рабочая нагрузка будет зависеть от количества записей, соответствующих ограничению.


Рейтинг:
0

OriginalGriff

Попробовать это:

SELECT TOP 25 O.OCSEmployeeCode AS UserID, 
       OCSBillNo AS BillNo, 
       CONVERT(VARCHAR(10),OCSBillDate,103) AS BillDate, 
       YEAR(OCSBillDate) AS mYear, 
       DATEPART(mm,OCSBillDate) AS mMonth
FROM  HMS_OCSBill O 
WHERE OCSCancelStatus IS NULL 
  AND OCSDiscontinueFlag IS NULL 
  AND O.OCSEmployeeCode='GAA6725' 
  AND 1 = CASE WHEN DATEPART(mm,getdate())<4 
                AND ((YEAR(OCSBillDate)=YEAR(GETDATE())-1 AND DATEPART(mm,OCSBillDate)>=4)) 
                OR  ((YEAR(OCSBillDate)=YEAR(GETDATE()) AND DATEPART(mm,OCSBillDate)<=3)) 
                OR  ((YEAR(OCSBillDate)=YEAR(GETDATE()) AND DATEPART(mm,OCSBillDate)>=4)) 
               THEN 1
               ELSE 0
          END
ORDER BY YEAR(OCSBillDate) DESC;


Member 10807962

Привет Друг,

Он не работает, он также дает информацию о предыдущих финансовых годах.

в основном я должен выполнить два условия, основанные на текущем месяце-

когда системный месяц меньше 4 (апрель), то первый блок будет выполнять другой следующий блок.

Скрыть Код Скопировать
Случай,когда DATEPART(mm, getdate())<4 затем
((Год(OCSBillDate)=год(getdate())для -1 и datepart(мм,OCSBillDate)&ГТ;=4)) или ((год(OCSBillDate)=год(функции getdate()) И DATEPART(mm,OCSBillDate)<=3))
ЕЩЕ
((Year(OCSBillDate)=year(getdate()) И DATEPART(mm,OCSBillDate)>=4)) конец)
Заказ по годам(OCSBillDate) DESC;

OriginalGriff

Посмотрите на то, что я сделал, и сформируйте свое состояние " где " таким же образом. Вы не можете сделать это так, как хотите, поэтому вам нужно получить свои и и или правильно.

Просто размещение одного и того же неисправного кода никому не поможет.
И я не могу проверить условия - у меня нет доступа к вашим данным...

Member 10807962

Выберите топ-100 О. OCSEmployeeCode как userId, OCSBillNo как BillNo, конвертировать(тип varchar(10),OCSBillDate,103), а BillDate, год(OCSBillDate) как mYear, функция datepart(мм,OCSBillDate) как mMonth, FinYr=
случай, когда (DATEPART(mm,OCSBillDate) между 4 и 12)
Затем конвертировать(VARCHAR(4),Year(OCSBillDate))+'-'+(конвертировать(VARCHAR(4),Year(OCSBillDate)+1))
Когда (DATEPART(mm,OCSBillDate) между 1 и 3)
Затем (конвертировать(тип varchar(4),год(OCSBillDate)-1))+'-'+конвертировать(тип varchar(4),год(OCSBillDate)) конец
из HMS_OCSBill O, где OCSCancelStatus равен Null, а OCSDiscontinueFlag равен Null
и O. OCSEmployeeCode='GAA6725' и FinYr=
(Случай, когда DATEPART(mm,getdate())<4
Затем конвертируйте(VARCHAR(4),Year(getdate())-1) + '-' + конвертировать(VARCHAR(4),год(getdate()))
Еще конвертировать(тип varchar(4),году(функции getdate())) + '-' + конвертировать(тип varchar(4),году(функции getdate())+1)
КОНЕЦ)
Заказ по годам(OCSBillDate) DESC;