calculate car parking hours in sql server

gba*_*alu 5 sql-server sql-server-2012

I have one doubt in sql server. How to calculate car login and logout time details?

table: cardetails

Here need to calculate each car how many hours spend in parking area.

creatE TABLE [dbo].[CarDetails](
    [carid] [int] NULL,
    [DateTimeDetail] [datetime] NULL,
    [Flag] [varchar](50) NULL
) 
INSERT [dbo].[CarDetails] ([carid], [DateTimeDetail], [Flag]) VALUES (1, CAST(N'2019-01-20T19:05:00.000' AS DateTime), N'in')
GO
INSERT [dbo].[CarDetails] ([carid], [DateTimeDetail], [Flag]) VALUES (1, CAST(N'2019-01-20T22:30:00.000' AS DateTime), N'out')
GO
INSERT [dbo].[CarDetails] ([carid], [DateTimeDetail], [Flag]) VALUES (2, CAST(N'2019-01-20T20:30:10.000' AS DateTime), N'in')
GO
INSERT [dbo].[CarDetails] ([carid], [DateTimeDetail], [Flag]) VALUES (2, CAST(N'2019-01-21T02:10:10.000' AS DateTime), N'out')
GO
INSERT [dbo].[CarDetails] ([carid], [DateTimeDetail], [Flag]) VALUES (3, CAST(N'2019-01-23T07:07:40.000' AS DateTime), N'in')
GO
INSERT [dbo].[CarDetails] ([carid], [DateTimeDetail], [Flag]) VALUES (3, CAST(N'2019-01-23T10:50:40.000' AS DateTime), N'out')
GO
INSERT [dbo].[CarDetails] ([carid], [DateTimeDetail], [Flag]) VALUES (3, CAST(N'2019-01-23T11:00:10.000' AS DateTime), N'in')
GO
INSERT [dbo].[CarDetails] ([carid], [DateTimeDetail], [Flag]) VALUES (3, CAST(N'2019-01-23T14:15:30.000' AS DateTime), N'out')
GO
INSERT [dbo].[CarDetails] ([carid], [DateTimeDetail], [Flag]) VALUES (2, CAST(N'2019-01-21T08:20:10.000' AS DateTime), N'in')
GO
INSERT [dbo].[CarDetails] ([carid], [DateTimeDetail], [Flag]) VALUES (2, CAST(N'2019-01-21T10:20:10.000' AS DateTime), N'out')
GO
Run Code Online (Sandbox Code Playgroud)

These are the records:

carid   DateTimeDetail              Flag
1       2019-01-20 19:05:00.000     in
1       2019-01-20 22:30:00.000     out
2       2019-01-20 20:30:10.000     in
2       2019-01-21 02:10:10.000     out
3       2019-01-23 07:07:40.000     in
3       2019-01-23 10:50:40.000     out
3       2019-01-23 11:00:10.000     in
3       2019-01-23 14:15:30.000     out
2       2019-01-21 08:20:10.000     in
2       2019-01-21 10:20:10.000     out
Run Code Online (Sandbox Code Playgroud)

Based on above data I want output like below :

carid | DateTimeDetails | Totaltime(hh:mm:ss)
  1     |2019-01-20       | 03:25:00
  2     |2019-01-20       | 05 :49:40
  2     |2019-01-21       | 02:00:00
  3     |2019-01-23       | 06:58:20
Run Code Online (Sandbox Code Playgroud)

I tried like below

select a.carid ,  sum(datediff(mm,b.datetimedetail,a.datetimedetail))as totalmm from  CarDetails a join  CarDetails b
on a.carid=b.carid

where a.datetimedetail<=(select max(c.[DateTimeDetail]) from CarDetails c join CarDetails a on a.carid=c.carid
)
group by a.carid 
Run Code Online (Sandbox Code Playgroud)

please tell me how to write query to achive this task in sql server

use*_*983 1

这并不能完全给您帖子中的预期结果,但是,我有充分的理由不这样做,并且我怀疑您的预期结果是错误的:

--Because, from experience, people can somehow enter things twice before exiting...
WITH Grp AS(
    SELECT CD.carid,
           CD.DateTimeDetail,
           CD.Flag,
           COUNT(CASE Flag WHEN 'Out' THEN 1 END) OVER (PARTITION BY carid ORDER BY CD.DateTimeDetail ASC
                                                        ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING) AS Grp
    FROM dbo.CarDetails CD),
InOut AS(
    SELECT carid,
           MIN(CASE Flag WHEN 'In' THEN Grp.DateTimeDetail END) AS TimeIn,
           MAX(CASE Flag WHEN 'Out' THEN Grp.DateTimeDetail END) AS [TimeOut]
    FROM Grp
    GROUP BY carid, grp)
SELECT carid,
       CONVERT(date,TimeIn) AS DateTimeDetails,
       CONVERT(time(0),DATEADD(SECOND,SUM(DATEDIFF(SECOND,TimeIn, [TimeOut])),'00:00:00')) AS TotalTime
FROM InOut
GROUP BY carid,
         CONVERT(date,TimeIn)
ORDER BY carid ASC;
Run Code Online (Sandbox Code Playgroud)

这给出了以下结果:

carid       DateTimeDetails TotalTime
----------- --------------- ----------------
1           2019-01-20      03:25:00
2           2019-01-20      05:40:00
2           2019-01-21      02:00:00
3           2019-01-23      06:58:20
Run Code Online (Sandbox Code Playgroud)

请注意,我05:40:00在 2019 年 1 月 20 日有一个 2 号车的订单。2号车20:30:10进站,02:10:10出发,历时5小时40分钟;不是 05 小时 49 分 40 秒后。如果您出于某种原因在该时间内达不到预期结果,则需要解释原因。

注意:如果汽车停留超过24小时,此功能将不起作用!你没有回答我的问题,所以我假设没有。如果可以的话,SQL Server 不支持超过 24 小时的时间,因此您最好返回秒数,并让您的应用程序显示 24 小时以上的时间。