Member 10194266 Ответов: 1

Проблема в том, когда я делаю сумму общего времени, которое находится в поле varchar


Привет У меня есть поле varchar в таблице sql , которое хранит время (например, '04:10:28' в этом формате), я застрял в том, как я могу сделать сумму общего времени, некоторые другие таблицы, используемые в этом запросе. что следует добавить в мой запрос, чтобы исправить эту проблему

имя поля - =T.Tripduration для времени

После того как я выполняю свой запрос то появляется какая то ошибка msg


Msg 130, Level 15, State 1, Line 6<br />
Cannot perform an aggregate function on an expression containing an aggregate or a subquery.<br />
<br />
Completion time: 2020-06-01T17:53:25.2400562+05:30


Спасибо

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

Я устал ниже запроса :

select O.OrgName,C.ClientName,V.vehicleregno,count(V.vehicleregno) as Trip_count, T.Tripduration,
sum(DATEDIFF(DAY, t.TripStartDate, t.TripEnddate)+1)as [Days_onTrip],
sum(case when t.UptimePer>100 then 100 else t.UptimePer end) /count(t.DeviceID )as UptimeDuringTrip , 
(25- sum(DATEDIFF(DAY, t.TripStartDate, t.TripEnddate)+1)) Truck_Idle_days ,'100' UptimeDuringIdling,
--,SUM(CAST(CAST(DATEADD(MINUTE,SUM(DATEDIFF(MINUTE,'00:00:00',CAST(T.Tripduration AS TIME))),'00:00:00')AS TIME)AS VARCHAR(8)) 
SUM(cast(cast(dateadd(MINUTE,SUM(DATEDIFF(MINUTE, '00:00:00', cast(convert(varchar(20),T.Tripduration ) as time))),'00:00:00') as time) as varchar(8)))
from tb_TripUptime t (nolock)
INNER join Client C(nolock) on C.ClientID=t.ClientID
INNER join Organization O (nolock) on O.OrgID=C.OrgID
inner join Vehicle V(nolock) on V.VehicleID=t.VehicleID
where O.OrgID =isnull(1,O.OrgID) and C.ClientID =isnull(null,C.ClientID) and t.vehicleid=isnull(null,t.vehicleid) and
TripEndDate between '2020-05-01 00:00:00' and '2020-05-25 23:59:59'
GROUP by  O.OrgName,C.ClientName,V.vehicleregno,T.Tripduration

ZurdoDev

Это время, как время, дата-время, или varchar?

Member 10194266

время хранится в поле varchar то есть Tripduration
пример значения=2.07:53 в моей таблице

Richard MacCutchan

Затем вам нужно изменить свою базу данных, чтобы она хранилась в виде типа Time или DateTime. Хранение дат и времени в виде строк делает жизнь очень трудной для вас.

Member 10194266

Привет Ричард ,
Для этой таблицы я не могу изменить тип данных, есть ли другой вариант ?

Richard MacCutchan

Да, перепроектируйте свою базу данных. Как я уже сказал, Вы просто накапливаете проблемы на будущее, не используя правильные типы данных.

Member 10194266

Спасибо Ричард

Dave Kreskowiak

Сохраняя все ваши времена в строковом столбце вместо использования столбца даты/времени, вы гарантируете, что любая математика, которую вы делаете в этом столбце, потребует дополнительного времени для вычисления. Это связано с тем, что база данных должна выполнять преобразование для каждой строки, на которой вы пытаетесь выполнить математику. Чем больше строк у вас есть, тем больше времени займет математика. Вы добавляете ненужные накладные расходы на операцию.

Member 10194266

Спасибо Дэйв

1 Ответов

Рейтинг:
10

OriginalGriff

Измените свою базу данных: всегда храните значения в наиболее подходящем типе данных, а не в VARCHAR / NVARCHAR.

Храните даты в DATE, DATETIME или DATETIME2; храните деньги в DECIMAL, храните счетчики в INT и т. д.
Если вы хотите сложить два раза вместе, то сохраните их в столбце INT или BIGINT - и сделайте их количеством секунд с полуночи. Затем вы можете добавить, вычесть их, усреднить их - все, что вам нужно, - и преобразовать результат в "читаемое человеком время", когда результат будет завершен.