Sql 等待每个日期的时间间隔计数

Sql 等待每个日期的时间间隔计数,sql,sql-server,Sql,Sql Server,给定模式和数据,我们需要找到每辆车等待的时间和每个日期的停车次数,并输入多个条目 ——创建表格 创建表[dbo]。[TABLE_Detail]( [Sno][int]不为空, [VehicleId][nchar](10)空, [DriverId][nchar](10)空, [LocationId][nchar](10)空, [StartTime][datetime2](7)空, [EndTime][datetime2](7)空 ) 创建表[dbo]。[TABLE_Main]( [Sno][int

给定模式和数据,我们需要找到每辆车等待的时间和每个日期的停车次数,并输入多个条目

——创建表格
创建表[dbo]。[TABLE_Detail](
[Sno][int]不为空,
[VehicleId][nchar](10)空,
[DriverId][nchar](10)空,
[LocationId][nchar](10)空,
[StartTime][datetime2](7)空,
[EndTime][datetime2](7)空
)
创建表[dbo]。[TABLE_Main](
[Sno][int]不为空,
[VehicleId][nchar](10)空,
[StartTime][datetime2](7)空,
[EndTime][datetime2](7)空)
--插入数据
插入[dbo]。[Table_Main]([Sno]、[VehicleId]、[StartTime]、[EndTime])值(1,N'1001',转换(N'2019-02-15T07:25:33.0000000'作为日期时间2),转换(N'2019-02-15T17:25:33.0000000'作为日期时间2))
插入[dbo]。[Table_Main]([Sno]、[VehicleId]、[StartTime]、[EndTime])值(2,N'1002',转换(N'2019-02-15T06:12:52.0000000'作为日期时间2),转换(N'2019-02-15T11:21:35.0000000'作为日期时间2))
插入[dbo]。[Table_Main]([Sno]、[VehicleId]、[StartTime]、[EndTime])值(3,N'1003',转换(N'2019-02-15T06:32:52.0000000'作为日期时间2),转换(N'2019-02-15T11:21:35.0000000'作为日期时间2))
插入[dbo]。[Table_Main]([Sno]、[VehicleId]、[StartTime]、[EndTime])值(4,N'1003',转换(N'2019-02-15T13:1:21.0000000'作为日期时间2),转换(N'2019-02-15T19:23:32.0000000'作为日期时间2))
插入[dbo].[Table_Detail]([Sno]、[VehicleId]、[DriverId]、[LocationId]、[StartTime]、[EndTime])值(1,N'1001',N'34',N'53',CAST(N'2019-02-15T07:55:32.0000000'作为日期时间2),CAST(N'2019-02-15T08:15:23.0000000'作为日期时间2))
插入[dbo].[Table_Detail]([Sno]、[VehicleId]、[DriverId]、[LocationId]、[StartTime]、[EndTime])值(2,N'1002',N'23',N'65',CAST(N'2019-02-15T07:11:33.0000000'作为日期时间2),CAST(N'2019-02-15T07:45:33.0000000'作为日期时间2))
插入[dbo].[Table_Detail]([Sno]、[VehicleId]、[DriverId]、[LocationId]、[StartTime]、[EndTime])值(3,N'1001',N'34',N'53',CAST(N'2019-02-15T09:22:52.0000000'作为日期时间2),CAST(N'2019-02-15T09:45:59.0000000'作为日期时间2))
插入[dbo].[Table_Detail]([Sno]、[VehicleId]、[DriverId]、[LocationId]、[StartTime]、[EndTime])值(4,N'1002',N'23',N'65',CAST(N'2019-02-15T10:25:13.0000000'作为日期时间2),CAST(N'2019-02-15T11:15:23.0000000'作为日期时间2))
插入[dbo].[Table_Detail]([Sno]、[VehicleId]、[DriverId]、[LocationId]、[StartTime]、[EndTime])值(5,N'1001',N'34',N'53',CAST(N'2019-02-15T11:25:36.0000000'作为日期时间2),CAST(N'2019-02-15T12:35:37.0000000'作为日期时间2))
插入[dbo].[Table_Detail]([Sno]、[VehicleId]、[DriverId]、[LocationId]、[StartTime]、[EndTime])值(6,N'1001',N'34',N'53',CAST(N'2019-02-15T15:15:33.0000000'作为日期时间2),CAST(N'2019-02-15T15:25:21.0000000'作为日期时间2))
插入[dbo].[Table_Detail]([Sno]、[VehicleId]、[DriverId]、[LocationId]、[StartTime]、[EndTime])值(7,N'1003',N'48',N'74',CAST(N'2019-02-15T07:13:13.0000000'作为日期时间2),CAST(N'2019-02-15T08:05:01.0000000'作为日期时间2))
插入[dbo].[Table_Detail]([Sno]、[VehicleId]、[DriverId]、[LocationId]、[StartTime]、[EndTime])值(8,N'1003',N'48',N'74',CAST(N'2019-02-15T09:43:12.0000000'作为日期时间2),CAST(N'2019-02-15T10:05:42.0000000'作为日期时间2))
插入[dbo].[Table_Detail]([Sno]、[VehicleId]、[DriverId]、[LocationId]、[StartTime]、[EndTime])值(9,N'1003',N'48',N'74',CAST(N'2019-02-15T14:13:13.0000000'作为日期时间2),CAST(N'2019-02-15T14:45:21.0000000'作为日期时间2))
每日车辆运输等待时间和访问次数

VehicleId   ElapsedTime     NoOfRecords
1001        02:02:47:000    4
1002        01:24:10:000    2
1003        01:04:43:000    2        
1003        00:32:10:000    1

基本上,您可以选择按表_detail中的vehicleid汇总所有记录,其日期范围位于表_main中记录的边界内

这样做的一种方法如下

select b.vehicleid
      ,dateadd(s,sum(datediff(s,b.starttime,b.endtime)),cast('20180101' as datetime)) as elapsed_time
      ,count(*)
  from dbo.table_main a
  join dbo.table_detail b 
    on a.vehicleid=b.vehicleid
   and a.starttime<=b.starttime
   and a.endtime>=b.endtime
group by b.vehicleid
        ,a.sno   

+-----------+-----------------------+-------------------+
| vehicleid |     elapsed_time      |    cnt_of_records |
+-----------+-----------------------+-------------------+
|      1001 |   01/01/2018 02:02:47 |                 4 |
|      1002 |   01/01/2018 01:24:10 |                 2 |
|      1003 |   01/01/2018 01:14:18 |                 2 |
|      1003 |   01/01/2018 00:32:08 |                 1 |
+-----------+-----------------------+-------------------+
选择b.vehicleid
,dateadd(s,sum(datediff(s,b.starttime,b.endtime)),cast('20180101'作为datetime')作为已用时间
,count(*)
来自dbo.table_main a
连接dbo.table_详图b
在a.vehicleid=b.vehicleid上
a.starttime=b.endtime
b.vehicleid分组
,a.sno
+-----------+-----------------------+-------------------+
|车辆ID |运行时间|记录数量|
+-----------+-----------------------+-------------------+
|      1001 |   01/01/2018 02:02:47 |                 4 |
|      1002 |   01/01/2018 01:24:10 |                 2 |
|      1003 |   01/01/2018 01:14:18 |                 2 |
|      1003 |   01/01/2018 00:32:08 |                 1 |
+-----------+-----------------------+-------------------+
这是一个dbfiddle链接


基本上,您可以选择按表\u detail中的vehicleid汇总所有记录,其日期范围位于表\u main中记录的边界内

这样做的一种方法如下

select b.vehicleid
      ,dateadd(s,sum(datediff(s,b.starttime,b.endtime)),cast('20180101' as datetime)) as elapsed_time
      ,count(*)
  from dbo.table_main a
  join dbo.table_detail b 
    on a.vehicleid=b.vehicleid
   and a.starttime<=b.starttime
   and a.endtime>=b.endtime
group by b.vehicleid
        ,a.sno   

+-----------+-----------------------+-------------------+
| vehicleid |     elapsed_time      |    cnt_of_records |
+-----------+-----------------------+-------------------+
|      1001 |   01/01/2018 02:02:47 |                 4 |
|      1002 |   01/01/2018 01:24:10 |                 2 |
|      1003 |   01/01/2018 01:14:18 |                 2 |
|      1003 |   01/01/2018 00:32:08 |                 1 |
+-----------+-----------------------+-------------------+
选择b.vehicleid
,dateadd(s,sum(datediff(s,b.starttime,b.endtime)),cast('20180101'作为datetime')作为已用时间
,count(*)
来自dbo.table_main a
连接dbo.table_详图b
在a.vehicleid=b.vehicleid上
a.starttime=b.endtime
b.vehicleid分组
,a.sno
+-----------+-----------------------+-------------------+
|车辆ID |运行时间|记录数量|
+-----------+-----------------------+-------------------+
|      1001 |   01/01/2018 02:02:47 |                 4 |
|      1002 |   01/01/2018 01:24:10 |                 2 |
|      1003 |   01/01/2018 01:14:18 |                 2 |
|      1003 |   01/01/2018 00:32:08 |                 1 |
+-----------+-----------------------+-------------------+
这是一个dbfiddle链接


您可以尝试以下方法

SELECT vehicleid, 
       CONVERT(VARCHAR, Dateadd(ms, te, 0), 114) AS ElapsedTime, 
       ct                                        AS NoOfRecords 
FROM   (SELECT vehicleid, 
               Sno,
               Sum(dms) te, 
               Count(*) ct 
        FROM   (SELECT d.vehicleid, m.Sno,
                       Datediff(ms, d.starttime, d.endtime) dms 
                FROM   [table_detail] d
                inner join [Table_Main] m on d.VehicleId=m.VehicleId 
                where m.starttime<=d.starttime
                                and m.endtime>=d.endtime

                )t 
        GROUP  BY vehicleid, sno) t1 

你可以试试下面的方法

SELECT vehicleid, 
       CONVERT(VARCHAR, Dateadd(ms, te, 0), 114) AS ElapsedTime, 
       ct                                        AS NoOfRecords 
FROM   (SELECT vehicleid, 
               Sno,
               Sum(dms) te, 
               Count(*) ct 
        FROM   (SELECT d.vehicleid, m.Sno,
                       Datediff(ms, d.starttime, d.endtime) dms 
                FROM   [table_detail] d
                inner join [Table_Main] m on d.VehicleId=m.VehicleId 
                where m.starttime<=d.starttime
                                and m.endtime>=d.endtime

                )t 
        GROUP  BY vehicleid, sno) t1