在给定日期的时间段内从MySQL数据库获取信息

时间:2015-02-03 16:35:59

标签: mysql sql

给出一个简单的数据库,如:

database

如何在一个查询中查看员工在当前年度的总销售数量?

例如,员工的开始日期为2015年3月1日。2015年3月1日至2016年2月28日为第一年,2016年3月1日至28日之间2017年2月是第二年等。

因此,如果查询在2017年3月5日运行,则会在2017年3月1日到2017年3月5日之间返回数据,因为这是当前年份。同样,如果查询是在2017年2月13日运行的,它将返回2016年3月1日至2017年2月13日之间的所有销售,因为这将是他们当前的年份。

目前,我能够实现这一目标的唯一方法是在一个查询中检索员工的开始日期,从一年中查看月份和日期,检查日期是否已经过去,然后形成新的一年这样开始约会。比如这个:

//Get the year start date for the employee
$stmt = $dbh->prepare("select StartDate from employee where EmpID = ?");
$stmt->execute(array($empID));
$employee = $stmt->fetch(PDO::FETCH_ASSOC);
$dateArray = explode("-", $employee['StartDate']);

//If the current month and day is greater than the start date then its not been the end of the year, so the start year is the current year -1
//If not then it has not gone past the end of the year, and the start year is same as the current year.

if (date('m') <= $dateArray[1] && date('d') <= $dateArray[2]){
    $yearStart = (date('Y')-1)."-".$dateArray[1]."-".$dateArray[2];
}else{
    $yearStart = date('Y')."-".$dateArray[1]."-".$dateArray[2];
}

然后我可以再次查询数据库以从生成的年份开始检索所有销售。

以上是有效的,但有可能将其纳入单个MySQL查询吗?

1 个答案:

答案 0 :(得分:1)

这是一个有点复杂的日期算术。您需要将销售日期的月/日与开始日期的月/日进行比较。然后,您需要确定年份是否需要是当前年份或上一年。

以下表达了这一逻辑,假设销售日期不在将来:

select e.empId, count(*), sum(amount)
from employee e join
     sales s
     on e.empId = s.empId
where (date_format(now(), '%m-%d') >= date_format(e.startdate, '%m-%d') and
       s.date >= str_to_date(concat_ws('-', year(now()), month(e.startdate), day(e.startdate))
      ) or
      (date_format(now(), '%m-%d') < date_format(e.startdate, '%m-%d')
       s.date >= str_to_date(concat_ws('-', year(now()) - 1, month(e.startdate), day(e.startdate))
      )
group by e.empId