2017-02-07 14 views
0

У меня есть запрос, чтобы получить количество автобусов которые путешествуют менее чем в 100 км за date.So я использую запрос в PostgreSQLКак датировать TRUNC в HANA

 select day,count(*)as bus_count from(

    SELECT date_trunc('hour',start_time)::timestamp::date as day,bus_id,sum(distance_two_points) as distance 
    FROM public.datatable where start_time >= '2015-09-05 00:00:00' and start_time <= '2015-09-05 23:59:59' 
    group by day,bus_id 

    ) as A where distance<=250000 group by day 

Запрос возвращает результат

 day    bus_id distance 
     ___    ________ _________ 
    "2015-09-05 00:00:00" 1  523247 
    "2015-09-05 00:00:00" 2  135114 
    "2015-09-05 00:00:00" 3  178560 
    "2015-09-05 00:00:00" 4  400071 
    "2015-09-05 00:00:00" 5  312832 
    "2015-09-05 00:00:00" 6  237075 

Так что я теперь хочу использовать этот же запрос (достижения тех же результатов) в SAP HANA, но нет функции даты TRUNC и я также попытался

SELECT EXTRACT (DAY FROM TO_DATE (START_TIME, 'YYYY-MM-DD')) "extract" as day,bus_id,sum(distance_two_points) as distance 
     FROM public.datatable where start_time >= '2015-09-05 00:00:00' and start_time <= '2015-09-05 23:59:59' 
     group by day,bus_id 

     ) as A where distance<=250000 group by day 

Любая помощь приветствуется.

ответ

-1

Преобразование типа данных без даты и времени, как правило, не очень хорошая идея (дополнительный синтаксический анализ, кодирование, семантика ...).

Вместо этого используйте менее гранулированный тип данных datetime: daydate в этом случае.

create column table datatab (start_time seconddate, bus_id int, distance_two_points decimal (10, 2)); 


insert into datatab values (to_seconddate('05.09.2015 13:12:00'), 1, 50.2);  
insert into datatab values (to_seconddate('05.09.2015 13:22:00'), 1, 1.2);  
insert into datatab values (to_seconddate('05.09.2015 15:32:00'), 1, 24);  

insert into datatab values (to_seconddate('05.09.2015 13:12:00'), 1, 50.2);  

insert into datatab values (to_seconddate('05.09.2015 14:22:00'), 2, 1.2);  
insert into datatab values (to_seconddate('05.09.2015 16:32:00'), 2, 24);  


    select to_seconddate(day) as day,count(*) as bus_count from(

    SELECT to_date(start_time) as day, bus_id, sum(distance_two_points) as distance 
    FROM datatab 
    where start_time between '2015-09-05 00:00:00' and '2015-09-05 23:59:59' 
    group by to_date(start_time),bus_id 

    ) as A 
    where distance<=250000 
    group by day; 

Внутренний запрос дает вам:

DAY   BUS_ID DISTANCE 
2015-09-05 1  75.40 
2015-09-05 2  25.20 

Итак, ваш seconddate "start_time" теперь объединяются в daydate, а затем преобразуется обратно в 'seconddate.

+1

Конечно, это будет немного быстрее, чем to_nvarchar. Я думаю, что документация здесь не очень точная, она говорит для to_date: «Преобразует строку даты в тип данных DATE». Я думаю, что для типов даты/времени это прямое преобразование, а не через строку ... –

+1

Да, документация не является особенно всеобъемлющей во многих аспектах. Глядя на подпись функции показывает, что to_date принимает все виды типов данных в качестве входных данных. Еще одна важная проблема заключается в том, что обычно вы не хотите, чтобы тип данных STRING начинался с типа данных типа данных и просто хотел избавиться от часовой части. Ожидание будет заключаться в том, чтобы по-прежнему работать с типом данных datetime. –

+0

@LarsBr. Проблема в том, что мне нужна временная метка с часовым поясом, а не daydate. В противном случае я также могу извлечь все отдельно и объединить их вне запроса, но это тоже занимает много времени. –

-1

Если предположить, что start_time имеет некоторые данные/тип времени (например, SECONDDATE), вы можете использовать

...TO_NVARCHAR(START_TIME, 'YYYY-MM-DD') AS DAY... 

Вместо date_trunc ... в PostgreSQL

+0

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

0

Почему вы не используете функцию преобразования CAST()?

select 
    cast(now() as date) myDate 
from dummy; 
+0

Это то же самое, что to_seconddate() - просто больше набрав;) –

 Смежные вопросы

  • Нет связанных вопросов^_^