2009-06-17 3 views
1

У меня есть следующий запрос в MSSQL:SQL СРЕДНЕЕ ВРЕМЯ

select 
TRANSACTION_TYPE_ID 
,COUNT(TRANSACTION_TYPE_ID)AS NUMBER_OF_TRANSACTIONS 
,CAST(SUM(AMOUNT)AS DECIMAL (30,2)) AS TOTAL 
FROM 
    [ONLINE_TRANSACTION] 
WHERE CONVERT(CHAR(8), CREATED_ON, 114) >='17:30' AND AMOUNT IS NOT NULL AND  
TRANSACTION_TYPE_ID !='CHEQUE-STOP-TRANS-TYPE' 
GROUP BY TRANSACTION_TYPE_ID 
ORDER BY TRANSACTION_TYPE_ID 

Я хочу, чтобы показать тип сделок TRANSATION_TYPE_ID, как указано выше общего количества каждого вида сделки, как указано выше, но и среднее время произошли эти сделки CREATED_ON который datetime Я все еще не нашел хороший способ сделать это?

ответ

1

Одним из способов было бы преобразовать время в секундах, рассчитать среднее значение и затем преобразовать его в часы, минуты и секунды для результата.

+0

хорошая идея, я вроде ищет какой-то исходный код указателей благодаря Randolph – Andreas

3

На основании ответа Рэндольфа Поттера, вы можете найти среднее время как:

avg(DATEPART(hh,created_on)*60 + DATEPART(mi,created_on)) % 24 as AvgHour, 
avg(DATEPART(hh,created_on)*60 + DATEPART(mi,created_on))/24 as AvgMinute 
+0

я нашел это решение Aswell -> (stackoverflow.com/questions/529144/...) CONVERT (VARCHAR, CAST (AVG (CAST (CAST (CAST (LAST (created_on, 12) как datetime) AS FLOAT)) AS DATETIME), 114) + '0'AS AVARAGE_TIME Выполняя ответ Andomars и тот, что указан выше, я получаю разные результаты. ? – Andreas

+0

Я предположил, что created_on был столбцом datetime, но затем left (created_on, 12) даст синтаксическую ошибку. Измените свой вопрос и добавьте тип данных в столбец, с примерами строк. – Andomar

+0

Это неверно. –

1

Если ваш говорить о времени суток и не хотите получить конкретную дату, то есть. 5:32 вместо 4 января 2012 г. 5:32, ниже может помочь. Извините за колпачки, так я привык писать SQL.

CONVERT(VARCHAR,AVG(DATEPART(HH,CREATED_ON)*60 + DATEPART(MI,CREATED_ON))/60) + ':' + 
CASE WHEN CONVERT(VARCHAR,AVG(DATEPART(HH,CREATED_ON)*60 + DATEPART(MI,CREATED_ON)) % 60) < 10 
    THEN '0'+CONVERT(VARCHAR,AVG(DATEPART(HH,CREATED_ON)*60 + DATEPART(MI,CREATED_ON)) % 60) 
    ELSE CONVERT(VARCHAR,AVG(DATEPART(HH,CREATED_ON)*60 + DATEPART(MI,CREATED_ON)) % 60) 
END AS AVG_CREATED_ON 
1
SELECT FROM_UNIXTIME((ROUND((UNIX_TIMESTAMP(floor(timestamp_column))/ 60),0) * 60)) rounded_time 
FROM mysql_table 
WHERE timestamp_column BETWEEN STR_TO_DATE('31/07/2012','%d/%m/%Y') 
AND STR_TO_DATE('01/08/2012','%d/%m/%Y') 
Смежные вопросы