做报表的。
一个订单表有 创建时间字段,eg:2017-6-29
如果 30号没有订单,就没有 2017-6-30
想要实现 查出来 2017-6-30,当天的记录全为0
问题是 只能查出来已有的 记录日期,怎么解决?
你需要把所有要显示的时间当成一张虚拟表,然后left join 你的订单表就ok了
SELECT
l.date,
IFNULL(t.count, 0) count
FROM
(
SELECT
DATE_FORMAT(
ADDDATE('2016-06-01', INTERVAL @d DAY),
'%Y-%m-%d'
) AS date ,@d :=@d + 1 DAY
FROM
orders,
(SELECT @d := 0) temp
WHERE
ADDDATE('2016-06-01', INTERVAL @d DAY) <= DATE_FORMAT('2016-06-30', '%Y-%m-%d')
ORDER BY
DAY
) l
LEFT JOIN (
SELECT
DATE_FORMAT(o.create_time, '%Y-%m-%d') DAY,
count(o.id)
FROM
orders o
WHERE
DATE_FORMAT(o.create_time, '%Y-%m-%d') IN (
'2017-06-27',
'2017-06-28',
'2017-06-29',
'2017-06-30'
)
GROUP BY
DATE_FORMAT(create_time, '%Y-%m-%d')
) t ON l.date = t.DAY
参考:http://blog.csdn.net/fu_fei_wen/article/details/76186627
其实这样就可以,我们只需要在代码里面去匹配着这个时间
public static List getChangeData(List xdata, List<EhcartData> data) {
List result = new ArrayList();
Double num =null;
for (int i = 0; i < xdata.size(); i++) {
num = isHave( data, xdata.get(i).toString());
if(num!=null){
result.add(num);
}else{
result.add(0);
}
}
return result;
}
public static Double isHave(List<EhcartData> data, String xValue) {
EhcartData dataResult = null;
Double num =null;
for (int j = 0; j < data.size(); j++) {
dataResult = data.get(j);
if (dataResult.getXvalue().equals(xValue)) {
num =dataResult.getNum();
break;
}
}
return num;
}
效率低的太垃圾了。没有这样做的。