2017-04-14 52 views
0

我需要解决下面的SQL请求时间相关的查询

EmpId StartDate EndDate 
1 1/2/2017 12/31/9999 
1 8/10/2016 1/1/2017 
1 10/11/2015 8/9/2016 
1 2/10/2014 10/19/2015 

以上是表数据的一些帮助......

用户提供对前一个日期范围: 用户输入日期范围10 /二千零十五​​分之十一2017年1月1日

Q1)我需要从有效期为用户输入范围 Q2)对于每个记录的我需要以前的记录开始日期 - 因此该表把所有的记录输出应该是这样的

EmpId StartDate EndDate Last Start Date 
1 8/10/2016 1/1/2017 10/11/2015 
1 10/11/2015 8/9/2016 2/10/2014 

任何帮助表示赞赏..

感谢 斯里兰卡

回答

0

此查询应该工作,如果开始和结束日期是类型日期或时间戳:

SET @rangeStart =“2015年/ 10/11' ; SET @rangeEnd ='2017/01/01';

SELECT 
    `EmpId`, 
    `StartDate`, 
    `EndDate`, 
    (SELECT max(`StartDate`) 
      FROM `employees` e1 
      WHERE e1.`StartDate` < e.`StartDate` 
      ORDER BY e1.`StartDate` DESC 
      LIMIT 1) as `LastStartDate` 
FROM `employees` e 
WHERE @rangeStart <= `StartDate` AND `EndDate` <= @rangeEnd 
GROUP BY `EmpId`, `StartDate`,`EndDate` 
ORDER BY `EmpId`, `StartDate` DESC,`EndDate` DESC; 

请参阅SQL Fiddle Here。由于您没有指定表名,所以我使用了员工。

它也使用左手来完成加盟,这对大型数据集可能会更快:

SELECT 
    e.`EmpId`, 
    e.`StartDate`, 
    e.`EndDate`, 
    IFNULL(e1.`StartDate`,"") as `LastStartDate` 
FROM `employees` e 
LEFT JOIN `employees` e1 
    ON e.`EmpId` = e1.`EmpId` 
    AND e1.`StartDate` < e.`StartDate` 
WHERE @rangeStart <= e.`StartDate` AND e.`EndDate` <= @rangeEnd 
GROUP BY `EmpId`, `StartDate`,`EndDate` 
ORDER BY `EmpId`, `StartDate` DESC,`EndDate` DESC; 

的SQL小提琴两个是here