Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Требуется преобразовать текстовую строку в число / 25 сообщений из 31, страница 1 из 2
06.06.2017, 11:22
    #39466538
CrazyGooDvin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Требуется преобразовать текстовую строку в число
Доброго времени суток, не являюсь специалистом в этой области, но передо мной поставили задачу выводить среднее время нахождения объекта в статусе.
Для этого существует таблица TKSTATUS и поле STATUSTRACKING, все вроде бы просто AVG (STATUSTRACKING).
Но не все так просто, STATUSTRACKING является строковой и имеет не очень определенный формат в различных вариантах:
1) hh:mm:ss
2) hhh:mm:ss
3) hhhh:mm:ss
Еще раз, формат поля не дата, но записано в виде времени прошедшего в состоянии, разделенного двоеточием: часы, минуты, секунды
Возможно стоит hh*24*60 + mm*60 + ss, но я не знаю как это разделить и написать в функцию.
...
Рейтинг: 0 / 0
06.06.2017, 11:47
    #39466578
stax..
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Требуется преобразовать текстовую строку в число
CrazyGooDvin,
1) substr+instr вырезать поля
2) перевести в секунды
3) avg
4) обратно в чччч.mm.ss

.....
stax
...
Рейтинг: 0 / 0
06.06.2017, 14:22
    #39466823
CrazyGooDvin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Требуется преобразовать текстовую строку в число
А есть что-нибудь попроще, я думал можно в одном выражении сразу записать и вычисления секунд.
А то как то больно сложно получается, не могу разобраться в работе INSTR (на сколько понял она позволяет определить позицию для вырезания данных для функции SUBSTR).
Я не могу представить как вырезать переменное число символов ограниченных ':' при том в разных случаях по разному ограничены.

Вот примеры полей этой таблицы:
2110:25:03
00:01:02
02:35:67
167:41:26
...
Рейтинг: 0 / 0
06.06.2017, 14:29
    #39466834
Dshedoo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Требуется преобразовать текстовую строку в число
CrazyGooDvin,

Код: plsql
1.
2.
3.
4.
with q as (select '2110:25:03' as z from dual)
select substr(z,1,instr(z,':')-1) as hh
     , substr(z,instr(z,':')+1,instr(substr(z,instr(z,':')+1,length(z)-length(substr(z,1,instr(z,':')))),':')-1) as mi
 from q


Ну и секунды аналогично ;D
...
Рейтинг: 0 / 0
06.06.2017, 14:45
    #39466854
stax..
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Требуется преобразовать текстовую строку в число
CrazyGooDvin,
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
  1  with t as (select '2110:25:03' s from dual)
  2  select
  3   substr(s,1,instr(s,':')-1) h
  4  ,substr(s,instr(s,':')+1,instr(s,':',-1)-instr(s,':')-1) m
  5  ,substr(s,instr(s,':',-1)+1) s
  6* from t
SQL> /

H    M  S
---- -- --
2110 25 03



я так понимаю у вас минуты и секунды строго 2цифры, то можно еще проще

зы
можно регулярками, красывше но медленнее

.....
stax
...
Рейтинг: 0 / 0
06.06.2017, 15:22
    #39466902
CrazyGooDvin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Требуется преобразовать текстовую строку в число
stax..CrazyGooDvin,
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
  1  with t as (select '2110:25:03' s from dual)
  2  select
  3   substr(s,1,instr(s,':')-1) h
  4  ,substr(s,instr(s,':')+1,instr(s,':',-1)-instr(s,':')-1) m
  5  ,substr(s,instr(s,':',-1)+1) s
  6* from t
SQL> /

H    M  S
---- -- --
2110 25 03



я так понимаю у вас минуты и секунды строго 2цифры, то можно еще проще

зы
можно регулярками, красывше но медленнее

.....
stax

Я сам написал под свой запрос, только вот не знаю как дальше писать.
select
to_number(substr(STATUSTRACKING, 0, (INSTR (STATUSTRACKING,':'))-1)) as hh,
to_number(substr(STATUSTRACKING, -5, 2)) as mm,
to_number(substr(STATUSTRACKING, -5, 2)) as ss
from TKSTATUS where STATUSTRACKING is not NULL
Нужно теперь определить среднее значение из всех значений, но у меня не получается сложить эти данные to_number(substr(STATUSTRACKING, -5, 2)) почему то возвращает не верное число
...
Рейтинг: 0 / 0
06.06.2017, 15:28
    #39466917
Dshedoo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Требуется преобразовать текстовую строку в число
CrazyGooDvin,

Код: plsql
1.
2.
3.
4.
5.
select 
to_number(substr(STATUSTRACKING, 0, (INSTR (STATUSTRACKING,':'))-1))*60*60 +
to_number(substr(STATUSTRACKING, -5, 2))*60 +
to_number(substr(STATUSTRACKING, -2, 2)) as ss
from TKSTATUS where STATUSTRACKING is not NULL
...
Рейтинг: 0 / 0
06.06.2017, 16:05
    #39466966
stax..
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Требуется преобразовать текстовую строку в число
CrazyGooDvin to_number(substr(STATUSTRACKING, -5, 2)) почему то возвращает не верное число
посмотрите що Вам возвращает STATUSTRACKING и substr(STATUSTRACKING, -5, 2), а там и определитесь что дальше делать (как обходіть)

.....
stax
...
Рейтинг: 0 / 0
06.06.2017, 16:08
    #39466977
MaximaXXL
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Требуется преобразовать текстовую строку в число
CrazyGooDvin,

Если в конце пробел то -5 попадет не в минуты и как следствие не в число
...
Рейтинг: 0 / 0
06.06.2017, 16:15
    #39466992
CrazyGooDvin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Требуется преобразовать текстовую строку в число
DshedooCrazyGooDvin,

Код: plsql
1.
2.
3.
4.
5.
select 
to_number(substr(STATUSTRACKING, 0, (INSTR (STATUSTRACKING,':'))-1))*60*60 +
to_number(substr(STATUSTRACKING, -5, 2))*60 +
to_number(substr(STATUSTRACKING, -2, 2)) as ss
from TKSTATUS where STATUSTRACKING is not NULL


именно, я пошел правда уже чуть дальше
Код: plsql
1.
2.
3.
4.
5.
6.
7.
select round(avg(
to_number(substr(STATUSTRACKING, 0, (INSTR (STATUSTRACKING,':'))-1))*3600 + 
to_number(substr(STATUSTRACKING, -5, 2))*60 +
to_number(substr(STATUSTRACKING, -2, 2)))) as Srednee_znach
from TKSTATUS where STATUSTRACKING is not NULL 
    and status = 'ОТКРЫТ' 
    and CHANGEDATE between (sysdate -7) and (sysdate)



Другой вопрос, тут есть ситуация когда запись с таким статусом встречается несколько раз в таблице по одному и тому же ticketid, в таких случаях эти записи надо просуммировать и лишь потом вычислять среднее, хм или это уже просиходит, не могу сообразить...
...
Рейтинг: 0 / 0
06.06.2017, 16:25
    #39467005
trace.log
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Требуется преобразовать текстовую строку в число
CrazyGooDvinDshedooCrazyGooDvin,

Код: plsql
1.
2.
3.
4.
5.
select 
to_number(substr(STATUSTRACKING, 0, (INSTR (STATUSTRACKING,':'))-1))*60*60 +
to_number(substr(STATUSTRACKING, -5, 2))*60 +
to_number(substr(STATUSTRACKING, -2, 2)) as ss
from TKSTATUS where STATUSTRACKING is not NULL


именно, я пошел правда уже чуть дальше
Код: plsql
1.
2.
3.
4.
5.
6.
7.
select round(avg(
to_number(substr(STATUSTRACKING, 0, (INSTR (STATUSTRACKING,':'))-1))*3600 + 
to_number(substr(STATUSTRACKING, -5, 2))*60 +
to_number(substr(STATUSTRACKING, -2, 2)))) as Srednee_znach
from TKSTATUS where STATUSTRACKING is not NULL 
    and status = 'ОТКРЫТ' 
    and CHANGEDATE between (sysdate -7) and (sysdate)



Другой вопрос, тут есть ситуация когда запись с таким статусом встречается несколько раз в таблице по одному и тому же ticketid, в таких случаях эти записи надо просуммировать и лишь потом вычислять среднее, хм или это уже просиходит, не могу сообразить...

что мешает сделать тестовый пример и узнать наверняка??
...
Рейтинг: 0 / 0
06.06.2017, 16:59
    #39467059
CrazyGooDvin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Требуется преобразовать текстовую строку в число
trace.logCrazyGooDvinпропущено...

именно, я пошел правда уже чуть дальше
Код: plsql
1.
2.
3.
4.
5.
6.
7.
select round(avg(
to_number(substr(STATUSTRACKING, 0, (INSTR (STATUSTRACKING,':'))-1))*3600 + 
to_number(substr(STATUSTRACKING, -5, 2))*60 +
to_number(substr(STATUSTRACKING, -2, 2)))) as Srednee_znach
from TKSTATUS where STATUSTRACKING is not NULL 
    and status = 'ОТКРЫТ' 
    and CHANGEDATE between (sysdate -7) and (sysdate)



Другой вопрос, тут есть ситуация когда запись с таким статусом встречается несколько раз в таблице по одному и тому же ticketid, в таких случаях эти записи надо просуммировать и лишь потом вычислять среднее, хм или это уже просиходит, не могу сообразить...

что мешает сделать тестовый пример и узнать наверняка??
Проверил, считает это разными значениями и это сильно влияет на результат, нужно как то суммировать вначале все времена с одинаковыми статуса и одинаковыми tiketid. Где и как подскажите пожалуйста.
...
Рейтинг: 0 / 0
06.06.2017, 17:11
    #39467080
stax..
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Требуется преобразовать текстовую строку в число
CrazyGooDvin,

я не понял проблему
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
  1  select deptno,avg(sal_job) a from
  2   (select deptno,sum(sal) sal_job from emp group by deptno,job)
  3* group by deptno
SQL> /

    DEPTNO          A
---------- ----------
        30 3133,33333
        20       3625
        10 2916,66667



....
stax
...
Рейтинг: 0 / 0
07.06.2017, 15:39
    #39467923
CrazyGooDvin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Требуется преобразовать текстовую строку в число
stax..CrazyGooDvin,

я не понял проблему
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
  1  select deptno,avg(sal_job) a from
  2   (select deptno,sum(sal) sal_job from emp group by deptno,job)
  3* group by deptno
SQL> /

    DEPTNO          A
---------- ----------
        30 3133,33333
        20       3625
        10 2916,66667



....
stax

Спасибо, создал свой запрос, не так красиво и стройно, но как умею
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
select 
round(avg(Vremya_v_statuse_v_sec)) as Srednee_znach_v_sec
from (
select t.ticketid, sum(
to_number(substr(tk.STATUSTRACKING, 0, (INSTR (tk.STATUSTRACKING,':'))-1))*3600 + 
to_number(substr(tk.STATUSTRACKING, -5, 2))*60 +
to_number(substr(tk.STATUSTRACKING, -2, 2))) as Vremya_v_statuse_v_sec
 from tkstatus tk
inner join TICKET t on t.TICKETID = tk.TICKETID
    where tk.STATUSTRACKING is not NULL 
    and tk.TICKETID = t.ticketid
    and tk.status = 'НАЗНАЧЕН' 
    and t.CLASS = 'ЗУ'
    and tk.CHANGEDATE between TO_TIMESTAMP('2017/05/29 00:00:00', 'yyyy/mm/dd hh24:mi:ss') 
        and TO_TIMESTAMP('2017/05/29 01:00:00', 'yyyy/mm/dd hh24:mi:ss')
group by t.TICKETID)
...
Рейтинг: 0 / 0
07.06.2017, 16:30
    #39467984
stax..
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Требуется преобразовать текстовую строку в число
CrazyGooDvin,
У Вас среднеее по всей виборке, поетому можно без подзапроса
вложенные avg(sum())

Код: plsql
1.
2.
3.
4.
5.
6.
select avg(sum(sal)) av from emp
group by deptno
/
        AV
----------
      9675
...
Рейтинг: 0 / 0
08.06.2017, 09:56
    #39468342
CrazyGooDvin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Требуется преобразовать текстовую строку в число
stax..CrazyGooDvin,
У Вас среднеее по всей виборке, поетому можно без подзапроса
вложенные avg(sum())

Код: plsql
1.
2.
3.
4.
5.
6.
select avg(sum(sal)) av from emp
group by deptno
/
        AV
----------
      9675



Действительно, спасибо! Вот что получилось:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
select 
round(avg(sum(
to_number(substr(tk.STATUSTRACKING, 0, (INSTR (tk.STATUSTRACKING,':'))-1))*3600 + 
to_number(substr(tk.STATUSTRACKING, -5, 2))*60 +
to_number(substr(tk.STATUSTRACKING, -2, 2))))) as Srednee_vremya_v_sec
 from tkstatus tk
inner join TICKET t on t.TICKETID = tk.TICKETID
    where tk.STATUSTRACKING is not NULL 
    and tk.TICKETID = t.ticketid
    and tk.status = 'ОТКРЫТ' 
    and t.CLASS = 'ЗУ'
    and t.ACTUALFINISH between (trunc (TO_DATE(sysdate -1),'DDD')) and (trunc (TO_DATE(sysdate),'DDD'))
group by t.TICKETID
...
Рейтинг: 0 / 0
08.06.2017, 15:07
    #39468734
CrazyGooDvin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Требуется преобразовать текстовую строку в число
Как получить результат отношения двух count?
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
select 
(
(to_number(select count(t.ticketid) from ticket t where CLASS = 'ИНЦИДЕНТ' and  t.REPORTDATE between (trunc (TO_DATE(sysdate -1),'DDD')) and (trunc (TO_DATE(sysdate),'DDD'))))
/
(to_number(select count(t.ticketid) from ticket t where CLASS = 'ИНЦИДЕНТ' and  t.actualfinish between (trunc (TO_DATE(sysdate -1),'DDD')) and (trunc (TO_DATE(sysdate),'DDD'))))
)
as rez
 from TICKET
...
Рейтинг: 0 / 0
08.06.2017, 16:10
    #39468828
MaximaXXL
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Требуется преобразовать текстовую строку в число
CrazyGooDvin,

Что Вы вкладываете в понятие "отношение"?
и стоит ли делать селект из таблицы " from TICKET" в которой более одной записи чтоб получить ОДИН результат. Вы его размножите ...
...
Рейтинг: 0 / 0
08.06.2017, 16:21
    #39468847
stax..
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Требуется преобразовать текстовую строку в число
CrazyGooDvin,

не по теме
TO_DATE(sysdate -1)

TO_DATE лишнее (вернее вредное)

.....
stax
...
Рейтинг: 0 / 0
08.06.2017, 16:21
    #39468848
MaximaXXL
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Требуется преобразовать текстовую строку в число
CrazyGooDvin,

Я бы написал так
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
select count( case when t.REPORTDATE between (trunc (TO_DATE(sysdate -1),'DDD')) and (trunc (TO_DATE(sysdate),'DDD')) then 1 end)
         /
         count( case when t.actualfinish between (trunc (TO_DATE(sysdate -1),'DDD')) and (trunc (TO_DATE(sysdate),'DDD')) then 1 end)

from ticket t 
where CLASS = 'ИНЦИДЕНТ' 
   and (t.REPORTDATE between (trunc (TO_DATE(sysdate -1),'DDD')) and (trunc (TO_DATE(sysdate),'DDD'))
      or t.actualfinish between (trunc (TO_DATE(sysdate -1),'DDD')) and (trunc (TO_DATE(sysdate),'DDD'))
         )



но подумай над делением на 0
...
Рейтинг: 0 / 0
08.06.2017, 16:23
    #39468850
MaximaXXL
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Требуется преобразовать текстовую строку в число
stax..,

Согласен, так же как и count в to_number лишнее
...
Рейтинг: 0 / 0
08.06.2017, 16:23
    #39468852
andrey_anonymous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Требуется преобразовать текстовую строку в число
MaximaXXLЯ бы написал так
Код: plsql
1.
2.
3.
TO_DATE(sysdate -1) 
...
TO_DATE(sysdate)


А я бы так не написал...
...
Рейтинг: 0 / 0
08.06.2017, 16:28
    #39468857
MaximaXXL
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Требуется преобразовать текстовую строку в число
andrey_anonymous,

Да выдернул из оригинала не подумав =)
Вот:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
select count( case when t.REPORTDATE between (trunc (sysdate -1,'DDD')) and (trunc (sysdate,'DDD')) then 1 end)
         /
         count( case when t.actualfinish between (trunc (sysdate -1,'DDD')) and (trunc (sysdate,'DDD')) then 1 end)

from ticket t 
where CLASS = 'ИНЦИДЕНТ' 
   and (t.REPORTDATE between (trunc (sysdate -1,'DDD')) and (trunc (sysdate,'DDD'))
      or t.actualfinish between (trunc (sysdate -1,'DDD')) and (trunc (sysdate,'DDD'))
         )
...
Рейтинг: 0 / 0
08.06.2017, 16:37
    #39468865
CrazyGooDvin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Требуется преобразовать текстовую строку в число
MaximaXXLCrazyGooDvin,

Что Вы вкладываете в понятие "отношение"?
и стоит ли делать селект из таблицы " from TICKET" в которой более одной записи чтоб получить ОДИН результат. Вы его размножите ...
Деление результат одного запроса на результат другого запроса
авторCrazyGooDvin,

не по теме
TO_DATE(sysdate -1)

TO_DATE лишнее (вернее вредное)

.....
stax

авторCrazyGooDvin,

Я бы написал так
select count( case when t.REPORTDATE between (trunc (TO_DATE(sysdate -1),'DDD')) and (trunc (TO_DATE(sysdate),'DDD')) then 1 end)
/
count( case when t.actualfinish between (trunc (TO_DATE(sysdate -1),'DDD')) and (trunc (TO_DATE(sysdate),'DDD')) then 1 end)

from ticket t
where CLASS = 'ИНЦИДЕНТ'
and (t.REPORTDATE between (trunc (TO_DATE(sysdate -1),'DDD')) and (trunc (TO_DATE(sysdate),'DDD'))
or t.actualfinish between (trunc (TO_DATE(sysdate -1),'DDD')) and (trunc (TO_DATE(sysdate),'DDD'))
)



но подумай над делением на 0
не работает, пишет from нету где ожидался


авторMaximaXXL

Я бы написал так
TO_DATE(sysdate -1)
...
TO_DATE(sysdate)



А я бы так не написал...
А как иначе?
...
Рейтинг: 0 / 0
08.06.2017, 16:45
    #39468877
stax..
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Требуется преобразовать текстовую строку в число
CrazyGooDvin,

to_date(sysdate)

из-за неявного перобразование получим шо-то типа
TO_DATE(TO_CHAR(SYSDATE))
тоесть дату в строку, а строку обратно в дату

похожая история и с to_number(count(*))

.....
stax
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Требуется преобразовать текстовую строку в число / 25 сообщений из 31, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]