如何在 HANA 中截断日期

How to date trunc in HANA

我有一个查询来获取每辆行驶少于 100 公里的公交车的数量 date.So 我在 PostgreSQL 中使用该查询

     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

查询returns结果

       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 中使用相同的查询(实现相同的结果),但是没有日期截断函数,我也尝试了

 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

感谢任何帮助。

假设您的 start_time 属于某种 data/time 类型(例如 SECONDDATE),您可以使用

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

而不是 date_trunc... 在 PostgreSQL

转换为 non-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'。

为什么不用CAST()转换函数?

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

我更喜欢使用 seconds_between() 或 nano100_between() 函数。

select now(), 
       add_seconds(  to_date('1970.01.01', 'YYYY.MM.DD'),
                     round(
                        SECONDS_BETWEEN(
                            to_date('1970.01.01', 'YYYY.MM.DD'),
                            now()
                        )/3600
                     )*3600
       ) 
from dummy;

这看起来有点难看,但考虑到 to_date() 只计算一次而不是对每一行计算,秒算术接近 Hana 内部存储值的方式,它应该是最有效的很多。 也是最灵活的,按秒、分、时、日……年以下都可以。

PS: round() 支持所有舍入和截断选项。