2017-02-07 5 views
0

Ich habe eine Abfrage die Anzahl der Busse zu erhalten, die pro date.So weniger als 100 km reisen ich die Abfrage in PostgreSQL verwendenWie in HANA bis heute trunc

 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 

Die Abfrage gibt das Ergebnis

 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 

Deshalb möchte ich jetzt diese gleiche Abfrage verwenden in SAP HANA (gleiche Ergebnisse zu erzielen), aber es gibt kein Datum trunc Funktion und ich habe auch versucht,

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 

Jede Hilfe wird geschätzt.

Antwort

-1

Konvertieren in einem Nicht-Datumsdatentyp ist in der Regel verwenden könnte keine gute Idee (zusätzliches Parsing, Encoding, Semantik ...).

Verwenden Sie stattdessen einen weniger granularen Datetime-Datentyp: daydate in diesem Fall.

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; 

Die innere Abfrage gibt Ihnen:

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

So, Ihr seconddate "start_time" jetzt als daydate aggregiert und dann umgewandelt zurück zu 'seconddate'.

+1

Sicher, das wird etwas schneller als to_nvarchar. Ich denke, die Dokumentation ist hier nicht sehr genau, es heißt für to_date: "Konvertiert eine Datumszeichenfolge in einen DATE-Datentyp". Ich denke für Datum/Uhrzeit-Typen macht es eine direkte Konvertierung, nicht per String ... –

+1

Ja, die Dokumentation ist in vielen Aspekten nicht besonders umfangreich. Ein Blick auf die Funktionssignatur zeigt, dass to_date alle Arten von Datentypen als Eingabe akzeptiert. Ein weiteres wichtiges Problem ist, dass Sie normalerweise keinen STRING-Datentyp möchten, wenn Sie mit einem DateType-Datentyp beginnen und nur den Stunden-Teil davon loswerden möchten. Die Erwartung wäre, immer noch mit einem Datetime-Datentyp zu arbeiten. –

+0

@LarsBr. Das Problem ist, ich brauche einen Timestamp ohne Zeitzone und kein Datum. Ansonsten kann ich auch alles separat extrahieren und kombinieren sie außerhalb der Abfrage, aber das dauert auch ein bisschen lange Zeit. –

-1

Ihr START_TIME Unter der Annahme einiger Daten/Zeit-Typ (zB SECONDDATE) Sie

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

Statt DATE_TRUNC ... in PostgreSQL

+0

Das Datum in einen anderen Datentyp umwandeln, nur um die Stunde loszuwerden: Minuten Teil ist nicht die beste Wahl. Es erfordert das Kopieren, Formatieren und Kodieren von Daten, nur um Teile der bereits vorhandenen Daten zu ignorieren. –

0

Warum verwenden Sie nicht die CAST() - Konvertierungsfunktion?

+0

Das ist das gleiche wie to_seconddate() - nur mehr tippen;) –