如何在MySQL中使用变量进行SELECT?

时间:2015-07-28 12:34:48

标签: mysql sql select

我有一张表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)或..

1 个答案:

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

效率较低,因为它会在聚合整个表后过滤数据