我使用以下查询使用jdbc在postgresql中获取一天的数据。
int[] days={1,2,3,4,5,6,9,12,18,24}
for(i=0;i<days.length;i++){
//connect to database
String sql="select id,extract ('day' from time) as day,count(*) as count from public.data where time>='2016-10-'"+days[i]+'06:00:00' and time<='2016-10-"+days[i]+" 09:00:00' group by id,day ";
//execute sql and close connection
}
当前查询(循环中运行一次)给出了
id day count
___ ___ _____
1 1 10
2 1 12
3 1 18
就像这样,它会给每一天。 但这是每天都完成的,我将结果集写为csv。相反,我可以得到整个结果集,其中包含6到9期间的每一天计数,而不是执行许多sql语句?但我希望所有像
一样id day count
___ ___ _____
1 1 10
2 1 12
3 1 8
1 2 10
2 2 9
3 2 18
1 3 10
2 3 12
3 3 27
感谢任何帮助
答案 0 :(得分:1)
您可以在一个语句中执行此操作,无需循环:
select id,
extract(day from time) as day,
count(*) as count
from public.data
where extract(day from time) = any (array[1,2,3,4,5,6,9,12,18,24] )
and time::date between date '2016-10-01' and date '2016-10-31'
and time::time between time '06:00:00' and time '09:00:00'
group by id,day
我希望time
不是该专栏的真实姓名
答案 1 :(得分:0)
你可以使用过滤器WHERE提取(日期从一天开始):天和提取(从时间开始)在6到8之间。
:days用于hibernate查询中的参数映射,可以使用等效的sql。
答案 2 :(得分:0)
首先您的查询中存在问题:
日期应介于两个''
之间,而不是""
:
String sql="... where time>="2016-10-"+days[i]+"...
//--------------------------^--------^------------
您的查询应如下所示:
String sql="select id,extract ('day' from time) as day,count(*) as count
from public.data where time>='2016-10-"+days[i]+" 06:00:00'
and time<='2016-10-"+days[i]+" 09:00:00' group by id,day ";
第二次你必须不使用Statement in会导致语法错误或SQL注入,而你必须使用PreparedStatement