所以,我有这个声明,它返回客户所做订单的OrderDates。我试图将订单日期存储到变量或多个变量中,以计算平均值。
我知道,对于特定的结果,我们可以做这样的事情
DECLARE @tempvar DATE
SET @tempvar = (SELECT OrderDate From Orders WHERE CustID = '1234')
但问题是,如果select语句返回可变数量的结果(变量行),如0结果或2结果或4?
我知道我们可以通过@@ROWCOUNT
变量获取select语句返回的行数。
为了简单地说明我的问题,我需要存储select语句返回的最新和最旧日期,并将其除以返回的行数。
答案 0 :(得分:3)
如果您的主要目标是获取日期的平均值,那么您不需要将日期存储到变量中,您可以直接执行以下操作。
SELECT CAST(AVG(CAST(OrderDate AS FLOAT)) AS DATETIME) FROM Orders WHERE CustID = '1234'
您还可以将所有日期的平均值存储在变量中,您可以像下面这样进行。
DECLARE @AvgDate DATETIME
SELECT @AvgDate = CAST(AVG(CAST(OrderDate AS FLOAT)) AS DATETIME)
FROM Orders WHERE CustID = '1234'
如果您想将日期存储到某个变量中,在这种情况下要存储多于1个值,请选择以下表格数据类型。
DECLARE @OrderDates TABLE(OrderDate DATETIME)
INSERT INTO @OrderDates(OrderDate)
SELECT OrderDate From [Orders] WHERE CustID = '1234'
--TO GET AVG
SELECT CAST(AVG(CAST(OrderDate AS FLOAT)) AS DATETIME) FROM @OrderDates ;
-- RETURNS ALL ROW
SELECT * FROM @OrderDates
编辑:
换句话说,我需要在两者之间获得天数 SELECT语句返回的最高和最小日期
要查找MAX日期和最短日期之间的天数,您可以执行以下操作。
SELECT DATEDIFF(day, MIN(OrderDate), MAX(OrderDate)) FROM @OrderDates
OR
SELECT DATEDIFF(day, MIN(OrderDate), MAX(OrderDate)) FROM Orders WHERE CustID = '1234'
答案 1 :(得分:1)
我认为只需一行代码即可获得您想要的内容:
select dateadd(d, avg(datediff(d, '1970-01-01', OrderDate)), '19700101') from Orders where CustID = '1234'
在回复以下评论时,请尝试:
select
dateadd(d, datediff(d, '1970-01-01', max(OrderDate)) - datediff(d, '1970-01-01', min(OrderDate)) / count(*), '1970-01-01') as requested_calc,
dateadd(d, avg(datediff(d, '1970-01-01', OrderDate)), '19700101') as avg_date
from Orders
where CustID = '1234'
但是对于我的生活,我不明白为什么你会想要这个计算。所以我也保留了另一个。
我希望这会有所帮助。