SQL 查询 - 在日期和时间之间查找

Posted

技术标签:

【中文标题】SQL 查询 - 在日期和时间之间查找【英文标题】:SQL Query- Find in between date and time 【发布时间】:2017-03-02 06:37:32 【问题描述】:

我有一张这样的桌子

|  EmpId   |  InTime          | OutTime          |
+----------+------------------+------------------+
|      101 | 01/02/2009 10:00 | 01/02/2009 20:00 |
|      101 | 01/02/2009 18:00 | 01/02/2009 20:00 |
|      102 | 01/02/2009  2:00 | 01/02/2009  2:00 |
|      103 | 01/02/2009  2:00 | 01/02/2009  5:00 |
|      104 | 01/02/2009  3:03 | 01/02/2009  5:00 |
|      104 | 01/02/2009  3:45 | 01/02/2009  7:00 |
|      105 | 01/02/2009 10:00 | 01/02/2009 22:00 |           
|      106 | 01/02/2009  3:00 | 01/02/2009  4:00 | 
|      106 | 01/02/2009  3:58 | 01/02/2009  4:10 | 
+----------+------------------+------------------+

我想查找中间记录。

我的表有超过 10 万条记录。

例如:

    检查 Empid - 想要相同 然后检查日期和时间,第一个值从 10 开始,到 20 结束。在第二个记录中,从 8 开始,到 20 结束。所以第一条记录结束时间要替换为第二条记录结束时间(在日期和时间之间)

输出如下:

| EmpId    |  StartTime       | EndTime          | EndTime1         |   
+----------+------------------+------------------+------------------+
|      101 | 01/02/2009 10:00 | 01/02/2009 20:00 |01/02/2009 18:00  |
|      101 | 01/02/2009 18:00 | 01/02/2009 20:00 |                  |
|      102 | 01/02/2009  2:00 | 01/02/2009  2:00 |                  |
|      103 | 01/02/2009  2:00 | 01/02/2009  5:00 |                  |
|      104 | 01/02/2009  3:03 | 01/02/2009  5:00 |01/02/2009  3:45  |
|      104 | 01/02/2009  3:45 | 01/02/2009  7:00 |                  |
|      105 | 01/02/2009 10:00 | 01/02/2009 22:00 |                  |
|      106 | 01/02/2009  3:00 | 01/02/2009  4:00 | 01/02/2009  3:58 |
|      106 | 01/02/2009  3:58 | 01/02/2009  4:10 |                  |
+----------+------------------+------------------+------------------+

【问题讨论】:

【参考方案1】:

假设您实际上想要将第一条记录结束时间替换为第二条记录开始时间,如您在所需输出中显示的那样,并且假设共享相同 empid 的所有行都重叠,我认为一种解决方案就像这样简单:

    select empid, t1.intime starttime, t2.intime endtime t1.outtime endtime1 
    from table_name t1 
    left outer join table_name t2 on t1.empid = t2.empid and t1.intime < t2.intime order by 1,2;

使用自联接添加具有后继条目开始时间的列。使用左联接来保留没有后继的行

【讨论】:

以上是关于SQL 查询 - 在日期和时间之间查找的主要内容,如果未能解决你的问题,请参考以下文章

查找今天日期和日期列之间的年长

在 SQL Server 中查找非连续日期

需要在 SQL Server 2008 中查找两个日期之间的日期

查找表中的任何日期是不是在两个日期之间

SQL 查询日期范围保存在 2 列中

SQL:查找日期和条件之间的中间结果