#sql #datetime
#sql #datetime
Вопрос:
В настоящее время я пытаюсь найти среднее значение между двумя разными датами для нескольких строк. Таким образом, для каждой созданной даты вычтите назначенную дату. Затем найдите среднее значение по всему datediff (ищем результат в секундах)
declare @offset int;
declare @st_date date;
declare @en_date date;
set @offset = (@BrowserTimezoneOffSet);
set @st_date = (@st_datein);
set @en_date = (@en_datein);
select
avg(subtract) as [AVG Assigned Time]
from
(select
DATEDIFF(ss, ign.createdDate, ign.assignDate) as subtract
from
(select
DATEADD(mi,@offset,s.CreatedDateTime) as createdDate
,DATEADD(mi,@offset,w.AuditHistoryDateTime) as assignDate
from ServiceReq s, Audit_ServiceReq w
WHERE
w.OwnerTeam_IsChanged = N'True' --owner was actually changed at some point
AND s.Subject = N'General Request'
AND w.AuditHistoryUser != N'InternalServices' --Doesn't include those done automagically by system
AND w.AuditHistoryEventType != 1 --Doesn't include creation
AND DATEADD(mi,@offset,s.CreatedDateTime) >= @st_date --greater than start date
AND DATEADD(mi,@offset,s.CreatedDateTime) <= @en_date --less than end date
AND s.CreatedByTeam in ('IT Helpdesk','Unassigned') --check the team
) as ign enter code here
) as dp
Приведенное выше не возвращает точных данных. Я довольно новичок в этом, и я не уверен, что я делаю неправильно.
Любая помощь будет оценена
Комментарии:
1. Можете ли вы уточнить
isn't returning accurate
? Можете ли вы привести нам несколько примеров данных и результатов…2. Таким образом, смещение = 600 (по австралийскому времени) и для всего, что находится между началом (01/02/2014) и концом февраля (28/02/2014). В секундах запрос возвращает 193272 секунды из почти 500 строк. Тем не менее, я ищу что-то в 1000 иш в качестве возврата. Я полагаю, это может быть связано с тем, что DATEDIFF просматривает только минимальные и максимальные значения из строк, а не итеративно
3. Не могли бы вы проиллюстрировать проблему примером? Неясно, как две таблицы, из которых вы извлекаете данные, связаны друг с другом (как в «1: 1, 1: N, N: N?»). Хорошего и краткого примера того, как выглядят исходные наборы данных и какие выходные данные должны быть возвращены для них, может быть достаточно, чтобы прояснить это.
Ответ №1:
хотя вы могли бы сделать эту работу, это, вероятно, не лучший способ подойти к ней.
Я бы либо извлек строки и выполнил вычисления в коде (если гарантировано, что количество строк будет относительно небольшим), либо написал хранимую процедуру, которая извлекает строки с помощью курсора и повторяет их, чтобы вычислить то, что вы хотите.
Любой из этих подходов был бы гораздо более удобочитаемым и, следовательно, гораздо более удобным в обслуживании, чем чрезвычайно сложный SQL-запрос.
Я бы ожидал, что он тоже будет работать лучше. На протяжении многих лет я постоянно видел, как простые select с доступом к вычислениям на основе курсора превосходят сложные операторы select .
Комментарии:
1. У меня нет проблем с переходом по пути хранимой процедуры. Я предполагаю, что моя ошибка — это отсутствие знаний SQL. Как будет выглядеть код преобразования?
2. Я согласен, что есть преимущества в реализации логики в хранимой процедуре, а не в пакете с несколькими операторами на стороне клиента, но из вашей формулировки ( «… или напишите хранимую процедуру, которая извлекает строки с помощью курсора …» ), кажется, что хранимая процедура необходима для одногоиспользовать курсор, что неверно для Transact-SQL. Или, может быть, я слишком много читаю.
3. Да, вы слишком много читаете. Дело в том, что ANSI SQL основан на операциях set, и это скорее построчный тип.проблемы.