我需要一些帮助来解决以下 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/11/2015 1/1/2017
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
感谢任何帮助..
谢谢 斯里兰卡
最佳答案
如果开始日期和结束日期是 DATE 或 TIMESTAMP 类型,则此查询应该有效:
SET @rangeStart = '2015/10/11'; 设置@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 Fiddle 都是 here
关于mysql - 时间相关查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43405295/