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)
@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)