Выберите период времени с to_date()

Я пытаюсь выбрать определенный период времени (день и часы), чтобы получить среднее количество секунд, которые люди тратят на просмотр определенного канала.

Я попробовал эту конкретную функцию: (to_date)

select  cust_id, ini_datetime,end_datetime, avg(qtd_seconds) as Avg_Sec, Channel

from crm.tmp_4

where   ini_datetime between ( to_date(2019-11-30 17:50:00.0, 'YYYY-MM-DD HH24:MI:SS.FF') and 
to_date(2019-11-30 18:00:00.0,'YYYY-MM-DD HH24:MI:SS.FF') ) 
    and end_datetime between ( to_date(2019-11-30 19:40:00.0,'YYYY-MM-DD HH24:MI:SS.FF') and to_date(2019-11-30 19:50:00.0,'YYYY-MM-DD HH24:MI:SS.FF') ) 

group by cust_id,ini_datetime,end_datetime, Channel

но это дает мне эту ошибку: «Строка ParseException 3:50 не может распознать ввод рядом с« 17 »:« 50 »». Кто-нибудь знает, как решить эту проблему?

Я также пробовал to_timestamp и не работал.

Благодарю вас!


person MaryP    schedule 13.12.2019    source источник
comment
Буквенные строки в SQL должны быть заключены в одинарные кавычки.   -  person Álvaro González    schedule 13.12.2019


Ответы (3)


Значение должно быть заключено в кавычки, поэтому ваш запрос должен выглядеть так:

select  cust_id, ini_datetime,end_datetime, avg(qtd_seconds) as Avg_Sec, Channel    
from crm.tmp_4    
where ini_datetime between ( to_date('2019-11-30 17:50:00', 'YYYY-MM-DD HH24:MI:SS') 
        and to_date('2019-11-30 18:00:00','YYYY-MM-DD HH24:MI:SS') ) 
    and end_datetime between ( to_date('2019-11-30 19:40:00','YYYY-MM-DD HH24:MI:SS') 
        and to_date('2019-11-30 19:50:00','YYYY-MM-DD HH24:MI:SS') )     
group by cust_id,ini_datetime,end_datetime, Channel

Тип данных DATE не поддерживает доли секунды. Если они вам нужны, используйте TO_TIMESTAMP вместо TO_DATE.

person Wernfried Domscheit    schedule 13.12.2019
comment
Хорошо, я изменил предложение where на: where ini_datetime in ( to_timestamp('2019-11-30 17:50:00.0', 'YYYY-MM-DD HH24:MI:SS.FF'), to_timestamp('2019-11 -30 18:00:00.0','ГГГГ-ММ-ДД ЧЧ24:MI:СС.FF') ) и end_datetime в ( to_timestamp('2019-11-30 19:40:00.0','ГГГГ-ММ-ДД HH24:MI:SS.FF'), to_timestamp('2019-11-30 19:50:00.0','YYYY-MM-DD HH24:MI:SS.FF')) ) группируется по sa,ini_datetime,end_datetime; с отметкой времени, потому что мне нужны дроби. Но теперь на выходе строка 3:26. Недопустимая функция «to_timestamp». Это потому, что моя дата 2019-11-30, а не 30 ноября 19? - person MaryP; 13.12.2019
comment
A стандартный литерал, например timestamp '2019-11-30 17:50:00', будет намного меньше для ввода. - person William Robertson; 14.12.2019
comment
@ Мэри, я бы предположил простую опечатку. Возможно, отсутствует кавычка или скобка. - person Wernfried Domscheit; 14.12.2019

Вы так близко. Функция to_date принимает строку и возвращает ее на сегодняшний день. Вы передаете не строку, а некоторые символы, которые не имеют смысла для Oracle.

Также вам нужно удалить круглые скобки в between и миллисекундах (.0 и .FF), так как они недействительны в to_date.

select cust_id, ini_datetime,end_datetime, avg(qtd_seconds) as Avg_Sec, Channel
from crm.tmp_4
where ini_datetime between  to_date('2019-11-30 17:50:00', 'YYYY-MM-DD HH24:MI:SS') and 
to_date('2019-11-30 18:00:00','YYYY-MM-DD HH24:MI:SS')  
    and end_datetime between  to_date('2019-11-30 19:40:00','YYYY-MM-DD HH24:MI:SS') and to_date('2019-11-30 19:50:00.0','YYYY-MM-DD HH24:MI:SS') 
group by cust_id,ini_datetime,end_datetime, channel;
person Ergi Nushi    schedule 13.12.2019

Вы можете использовать литералы временных меток, чтобы упростить чтение:

select cust_id, ini_datetime, end_datetime, channel
     , avg(qtd_seconds) as avg_sec
from   crm.tmp_4
where  ini_datetime between timestamp '2019-11-30 17:50:00' and timestamp '2019-11-30 18:00:00'
and    end_datetime between timestamp '2019-11-30 19:40:00' and timestamp '2019-11-30 19:50:00'
group  by cust_id, ini_datetime, end_datetime, channel
person William Robertson    schedule 14.12.2019