sql-如何获取单个列的两个日期之间的datediff平均值(以天为单位)
我想这很容易,但唯一能解决这个问题的方法是临时表。基本上我有一个名为“myDate”的列,这是一个datetime列,我想知道的是所有这些行的平均天数差 所以基本上结果是这样的 2014年1月1日 1/14/2014 2014年1月20日 所以基本上我想知道平均是9.5天。1/1-1/14是13天,14/20是6天,所以19/2是9.5天sql-如何获取单个列的两个日期之间的datediff平均值(以天为单位),sql,sql-server-2012,Sql,Sql Server 2012,我想这很容易,但唯一能解决这个问题的方法是临时表。基本上我有一个名为“myDate”的列,这是一个datetime列,我想知道的是所有这些行的平均天数差 所以基本上结果是这样的 2014年1月1日 1/14/2014 2014年1月20日 所以基本上我想知道平均是9.5天。1/1-1/14是13天,14/20是6天,所以19/2是9.5天 我的基本查询是从myTable中选择myDate,平均值是最大值减去最小值除以天数的1。因此,您可以通过以下方式获得: select datediff(day
我的基本查询是从myTable中选择myDate,平均值是最大值减去最小值除以天数的1。因此,您可以通过以下方式获得:
select datediff(day, min(myDate), max(myDate)) / cast(count(*) - 1 as float)
from temp;
如果您想非常小心,可以防止潜在的除以零错误:
select (case when count(*) > 1
then datediff(day, min(myDate), max(myDate)) / cast(count(*) - 1 as float)
else 0
end)
from temp;
您可能不需要临时表,但我不相信上述方法适用于所有情况。您的要求是将一行的日期与下一行的日期进行比较,但没有迹象表明“下一行日期”总是大于上一行的日期。如果一对日期从datediff产生负结果,则这些日期之间的持续时间将忽略符号,即绝对值。e、 g.如果我们计算datediffday,2014-01-022013-01-03,结果是-364,但实际上持续时间是364,因为我们应该在datediff函数中翻转日期序列
| MYDATE | NXTDATE | RAWDIFF | DAYDIFF |
|------------|------------|---------|---------|
| 2013-01-01 | 2014-01-02 | 366 | 366 |
| 2014-01-02 | 2013-01-03 | -364 | 364 |
| 2013-01-03 | 2014-01-27 | 389 | 389 |
| 2014-01-27 | 2013-01-28 | -364 | 364 |
| 2013-01-28 | 2014-01-29 | 366 | 366 |
| 2014-01-29 | 2014-06-30 | 152 | 152 |
| 2014-06-30 | (null) | (null) | (null) |
因此,由于日期可能前后颠倒,用总跨度来衡量平均持续时间可能会产生误导
| MIN_DT | MAX_DT | MAX_MIN_SPAN | SPAN_AVG | SUM_DAYDIFFS | COUNT | TRUE_AVG |
|------------|------------|--------------|----------|--------------|-------|----------|
| 2013-01-01 | 2014-06-30 | 545 | 90.83333 | 2001 | 6 | 333.5 |
用于此目的的查询:
SELECT
MIN(mydate) min_dt
, MAX(mydate) max_dt
, DATEDIFF(DAY, MIN(mydate), MAX(mydate)) max_min_span
, DATEDIFF(DAY, MIN(mydate), MAX(mydate)) / (COUNT(daydiff) * 1.0) span_avg
, SUM(daydiff) sum_daydiffs
, COUNT(daydiff) count_daydiffs
, SUM(daydiff) / (COUNT(daydiff) * 1.0) true_avg
FROM (
SELECT
mydate
, ABS(DATEDIFF(DAY, mydate, LEAD(mydate) OVER (ORDER BY (SELECT 1)) )) AS daydiff
FROM mytable
) sq
;
SELECT
mydate
, lead(mydate) over(order by (select 1)) nxtdate
, DATEDIFF(DAY, mydate, LEAD(mydate) OVER (ORDER BY (SELECT 1)) ) AS rawdiff
, ABS(DATEDIFF(DAY, mydate, LEAD(mydate) OVER (ORDER BY (SELECT 1)) )) AS daydiff
FROM mytable
;
请参阅:我不希望在临时表中执行此操作。此选项是否包含select中的所有日期?