最近项目中遇到分组查询数据,按日期显示,如果那个日期没有数据,也要把日期显示出来.
有两个方案:1)在数据库建一个用于所有日期的表,然后让查询结果与之关联。
2)在程序中填充。
对于方案一的话,可以写定时任务或者存储过程将日期写入相应的日期表,注意这个日期表只是为了查询的时候,带出数据为空的数据中的日期。以空间换取时间(简单实现)
方案二是:利用一次循环,将日期直接填充到list中,
具体原理是:start比对原数组,如果有就添加到新数组,没有就填充空数据到新数组,直到结束
package test; import java.util.Date; public class Dog { private String name; private Date birthday; public String getName() { return name; } public void setName(String name) { this.name = name; } public Date getBirthday() { return birthday; } public void setBirthday(Date birthday) { this.birthday = birthday; } }
具体实现如下
关键代码如下
public static List<Dog> addDayForNull(List<Dog> oldList,Date start,Date end){ long n=getDateDay(start,end); ArrayList<Dog> newList=new ArrayList<Dog>(); int num=oldList.size(); int temp=0; for(int i=0;i<n;i++){ if(temp < num){ //如果开始日期小于当前记录日期则增加空白数据 if(start.compareTo(oldList.get(temp).getBirthday()) < 0){ Dog dog=getNewDag(start); newList.add(dog); } if(start.compareTo(oldList.get(temp).getBirthday()) == 0){//原数据加入 newList.add(oldList.get(temp)); temp++; } }else if(temp >= num && start.compareTo(end) <= 0){//加入空数据直到结束时间 Dog dog=getNewDag(start); newList.add(dog); } //开始时间向前加一天 start=addDateOneDay(start); } return newList;
public static Date addDateOneDay(Date date) { if (null == date) { return date; } Calendar c = Calendar.getInstance(); c.setTime(date); //设置当前日期 c.add(Calendar.DATE, 1); //日期加1天 // c.add(Calendar.DATE, -1); //日期减1天 date = c.getTime(); return date; }