2017-04-14 49 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