我有一张表myTable
Id userID month year login day
1628325 812467 1 2015 1 6
1628326 969054 1 2015 2 9
1628327 812467 2 2015 1 27
1628328 811602 2 2015 1 27
1628329 952056 3 2015 3 2
1628330 1082029 3 2015 5 2
1628337 952056 3 2015 1 3
1628338 952056 3 2015 6 4
1628339 812467 3 2015 2 4
1628340 1082029 3 2015 2 4
1628341 811602 3 2015 4 4
1628349 1081988 3 2015 1 4
我需要计算按日期登录的总数。 我有2个传入变量:startDate和:endDate。所以选择应该是这样的:
SELECT DATE_FORMAT(Date, '%Y/%m/%d') "Day", sum(login) FROM myTable WHERE Date >=:startDate AND Date<:endDate ORDER BY Date DESC
如何实施?
变量来自jsp page
从Eclipse中的调试模式我可以看到:来自jsp页面的startDate和:endDate变量 - 具有以下格式:
Wed Jul 01 00:00:00 EEST 2015,Tue Jul 28 00:00:00 EEST 2015
当我运行报告时,它没有显示任何内容。可能是时间格式表示的问题? (%y-%m-%d)或(%y /%m /%d)或..
答案 0 :(得分:1)
您可以从组件构建日期。一种方法是使用str_to_date()
。但是,您确实应该将日期存储为日期,而不是单个组件。 MySQL对日期有很好的支持,所以你应该使用数据库的这些功能。
这是一种方式:
SELECT str_to_date(concat_ws('-', year, month, day), '%Y-%m-%d') as date, sum(login)
FROM myTable
WHERE str_to_date(concat_ws('-', year, month, day), '%Y-%m-%d') >= :startDate AND
str_to_date(concat_ws('-', year, month, day), '%Y-%m-%d') < :endDate
GROUP BY date
ORDER BY date;
需要更多处理但更容易编写的替代方法是使用having
:
SELECT str_to_date(concat_ws('-', year, month, day), '%Y-%m-%d') as date, sum(login)
FROM myTable
GROUP BY date
HAVING date >= :startDate and date < :endDate
ORDER BY date;
效率较低,因为它会在聚合整个表后过滤数据。