获取每个日期的第一条和最后一条记录并计算它们的差异

Daw*_*wan 2 sql-server sql-server-2012

我需要计算DATEDIFF每个日期的第一条记录与每个日期EventCode = 1的最后一条记录之间的秒数EventCode = 2

我在这里发布了 2 天的示例数据集:http : //data.stackexchange.com/dba/query/515591/calculate-the-difference-between-first-event-and-last-event-for-each-日期

所以这就是我如何获得每个日期的第一条记录:

Select
    LogDate,
    StartOfDay = MIN(LogDateTime),
    EventCode
FROM (
        Select 
            LogId,
            LogDateTime,
            LogDate = FORMAT(LogDateTime, 'dd-MMM-yyyy'),
            DriverId,
            EventCode
        FROM 
            #MyLogs
        WHERE EventCode = 1
     ) A 
Group By
        LogDate,  EventCode
Run Code Online (Sandbox Code Playgroud)

这就是我获取每个日期的最后记录的方式 EventCode = 2

Select
    LogDate,
    EndOfDay = MAX(LogDateTime),
    EventCode
FROM (
        Select 
            LogId,
            LogDateTime,
            LogDate = FORMAT(LogDateTime, 'dd-MMM-yyyy'),
            DriverId,
            EventCode
        FROM 
            #MyLogs
        WHERE EventCode = 2
     ) A 
Group By
        LogDate, EventCode
Run Code Online (Sandbox Code Playgroud)

但是如何在单个结果集中获得相同的结果?我需要获得每个日期的第一条记录和每个日期的最后一条记录之间的秒差。

结果集示例:

| Date        | StartOfDay              | EndOfDay                | Start - End |
|-------------|-------------------------|-------------------------|-------------|
| 20-Jul-2016 | 2016-07-20 04:00:32.000 | 2016-07-20 13:05:19.000 |             |
| 21-Jul-2016 | 2016-07-21 04:55:52.000 | 2016-07-21 14:49:25.000 |             |
|             |                         |                         |             |
Run Code Online (Sandbox Code Playgroud)

dno*_*eth 6

@Lennart 的答案可以简化为一个 Group By:

SELECT LogDate, StartOfDay, EndOfDay, 
    DATEDIFF(s, StartOfDay, EndOfDay) AS ElapsedSeconds
FROM
  (
    SELECT
        -- instead of FORMAT better use a Standard SQL CAST:
        CAST(LogDateTime AS DATE) AS LogDate,

        MIN(CASE WHEN EventCode = 1 THEN LogDateTime END) AS StartOfDay,
        MAX(CASE WHEN EventCode = 2 THEN LogDateTime END) AS EndOfDay
    FROM #MyLogs
    WHERE EventCode in (1,2)
    GROUP BY
        CAST(LogDateTime AS DATE)
        -- Pivot in a single stepby removing EventCode 
  ) AS dt;
Run Code Online (Sandbox Code Playgroud)

查看查询