mysql - 时间相关查询

标签 mysql sql

我需要一些帮助来解决以下 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/

相关文章:

php mySQL准备续集,只显示与登录用户的用户ID相关联的结果

sql - 在 SQL 中编写 CASE 语句

sql - 我的用例能否在不影响性能的情况下合并到单个查询中?

sql - 使用脚本在 SQL Server 中的其他列之间插入列

mysql - 如何设计用于访问不同位置的表

php - 如何检查 'YYYY-MM-DD' 格式的日期和 PHP 中 'Unix Time stamp' 格式的日期?

MySQL 插入 CASE WHEN/THEN/ELSE

php - 加快laravel查询速度[解决]

mysql - 从范围的不同区域选择行的 SQL 查询

mysql - MySQL 中的复杂查询