从所选日期范围内获取平均小时数

5
我有一张订单表,其中有一个数据类型为“Datetime”的列,其中包含产品到达公司(客户)的日期和时间,并且我有多种类型的用户,例如:员工、公司所有者(客户)、调度员等。
我已经成功使用以下 T-SQL 查询获取了特定公司所有者所拥有的订单日期范围:
declare @username varchar(130), @DateFrom varchar(10), @DateTo varchar(10)
set @username = 'chabow';set @DateFrom='4/01/2018';set @DateTo='6/30/2018'
;with cte as (
    select count(o.ArrivalDate) as orders_count, cast(o.ArrivalDate as Date) as ArrivalDate
    from view_MembershipUsers msu
    inner join XrefCompanyUsers rfu on  msu.UserName = rfu.UserName
    inner join Company f on f.CompanyID = rfu.CompanyID
    inner join orders o on o.CompanyID = f.CompanyID
    where msu.UserName = @username and
    (o.ArrivalDate >= @DateFrom and  o.ArrivalDate <= @DateTo)
    group  by cast(o.ArrivalDate as Date)
    )
    select *,
    (select max(orders_count)+2 from  cte) as Total
    from cte    
    order by ArrivalDate

我需要获取的是产品到达平均时间,以及从所选日期范围内使用上述查询检索到的数据。我不知道如何在不计算日期差异的情况下从该日期范围中获得小时平均值,因为我需要读取每一行的“日期”以获得最可能准确的平均小时数。我已提取了一些示例日期以方便大家帮助我。
create table SelectedData
(ArrivalDate date, ActualDateTime datetime)
insert into SelectedData values
('2018-04-01','2018-04-01 20:45:00.000'),
('2018-04-04','2018-04-04 19:00:00.000'),
('2018-04-05','2018-04-05 14:00:00.000'),
('2018-04-05','2018-04-05 14:23:00.000'),
('2018-04-05','2018-04-05 18:30:00.000'),
('2018-04-06','2018-04-06 12:30:00.000'),
('2018-04-06','2018-04-06 18:08:00.000')

declare @DateFrom varchar(10), @DateTo varchar(10)
    set @DateFrom='4/01/2018';set @DateTo='6/30/2018'

    select *
    from SelectedData   
    order by ArrivalDate

感谢您的来信。

我有点困惑。你提到类型是日期(Date),在你的代码中也反映出来了(ActualDateTime date),但是你插入的是日期和时间?为什么是日期而不是日期时间(DateTime)? - WynDiesel
数据类型“date”不存储时间信息,只有日期部分。您应该使用“datetime”或“smalldatetime”。 - CrimsonKing
修改了,我的错,谢谢提醒。 :) - ARr0w
1个回答

3
将您的类型更改为DateTime,而不是日期。像这样:
drop table SelectedData
create table SelectedData
(ArrivalDate date, ActualDateTime datetime)
insert into SelectedData values
('2018-04-01','2018-04-01 20:45:00.000'),
('2018-04-04','2018-04-04 19:00:00.000'),
('2018-04-05','2018-04-05 14:00:00.000'),
('2018-04-05','2018-04-05 14:23:00.000'),
('2018-04-05','2018-04-05 18:30:00.000'),
('2018-04-06','2018-04-06 12:30:00.000'),
('2018-04-06','2018-04-06 18:08:00.000')

declare @DateFrom varchar(10), @DateTo varchar(10)
set @DateFrom='4/01/2018';set @DateTo='6/30/2018'

select avg(datePart(hour, ActualDateTime))
from SelectedData   
--order by ArrivalDate

然后从日期中获取小时的日期部分,然后取平均值。


它返回16,你能否解释一下为什么会返回16,计算公式是什么 - 我问这个问题是为了学习和获取知识。我真的会非常感激的兄弟。谢谢你的答案! - ARr0w
1
这有两个部分;第一个是Datepart(part, date),从日期中获取特定的部分。在这种情况下,我从ActualDateTime中提取小时部分,它是一个整数。现在,我们有了一个整数列表。然后,第二个函数Avg返回值列表的平均值,在这种情况下是小时。因此,本质上我是在说..给我所有ActualDateTime的小时部分。很酷。现在,对于那些小时部分,给我平均值。我讲得通吗? - WynDiesel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接