Рейтинг:
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;