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