如何一次获取数据

时间:2017-03-23 07:46:25

标签: java sql postgresql jdbc

我使用以下查询使用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

感谢任何帮助

3 个答案:

答案 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