2014-10-03 3 views
0
CREATE TABLE "DBA"."TIME_SPENT_DATA" (
    "id" BIGINT NOT NULL, 
    "manual_number" INTEGER NULL, 
    "user_id" INTEGER NULL, 
    "session_id" VARCHAR(100) NULL, 
    "total_time_on_site" VARCHAR(100) NULL, 
    "date_t" DATE NULL, 
    PRIMARY KEY ("id" ASC) 
) IN "system"; 

id,manual_number,user_id,session_id,total_time_on_site,date_t 
3,38001,1357,'123','**3h27m42s**','2014-10-02' 
4,38001,1357,'123','**2h20m42s**','2014-10-02' 

Я хочу сделать это:ли сумма - группы в Sybase колонкой, которая представляет собой период

select manual_number,user_id,session_id, sum(total_time_on_site) 
FROM "DBA"."TIME_SPENT_DATA" group by manual_number,user_id,session_id 

Я знаю, что я не могу сделать это, так как total_time_on_site является VARCHAR. Но как я могу это достичь? Я хочу добавить эти значения (и если у меня есть 25h - мне нужно отобразить 1d 1h)

Могу ли я это сделать? Спасибо

+0

My $ 0,02: Вытяните его в какой-то код, запустить его через регулярное выражение, разобрать ваши номера, воронка барахло в лог-файл, а затем верните его в базу данных в удобном для использования формате (например, общее количество секунд, сохраненных как целое число). Затем суммируйте. –

+0

Да, вот что я собираюсь делать :) Спасибо – user3796867

ответ

0

Несмотря на то, что вам может быть лучше делать преобразование за пределами сервера, я не мог удержаться от возиться с вашими данными, и если вы хотите сделать это в базе данных, то гибкое использование подстроки, charindex и casts должно сработать. Не на 100% он свободен от ошибок, но он действительно работал для ваших довольно ограниченных тестовых данных.

Sample SQL Fiddle

SELECT 
    manual_number, user_id, session_id, 
    CAST(DATEADD(second,SUM(
     CAST(SUBSTRING(total_time_on_site, PATINDEX('%[0-60]%', total_time_on_site), CHARINDEX('h',total_time_on_site)-CHARINDEX('*',total_time_on_site,2)-1) AS INT)*60*60+ 
     CAST(SUBSTRING(total_time_on_site, CHARINDEX('h',total_time_on_site,0)+1, CHARINDEX('m',total_time_on_site)-CHARINDEX('h',total_time_on_site,0)-1) AS INT)*60+ 
     CAST(SUBSTRING(total_time_on_site, CHARINDEX('m',total_time_on_site,0)+1, CHARINDEX('s',total_time_on_site)-CHARINDEX('m',total_time_on_site,0)-1) AS INT) 
     ),0) 
    AS TIME) AS sum_of_total_time_on_site_as_time 
FROM TIME_SPENT_DATA 
GROUP BY manual_number, user_id, session_id 

Выход:

manual_number user_id  session_id sum_of_total_time_on_site_as_time 
------------- ----------- ---------- --------------------------------- 
38001   1357  123  05:48:24.0000000 
Смежные вопросы