如何在 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() 支持所有舍入和截断选项。
我有一个查询来获取每辆行驶少于 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() 支持所有舍入和截断选项。