Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
sql-如何获取单个列的两个日期之间的datediff平均值(以天为单位)_Sql_Sql Server 2012 - Fatal编程技术网

sql-如何获取单个列的两个日期之间的datediff平均值(以天为单位)

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

我想这很容易,但唯一能解决这个问题的方法是临时表。基本上我有一个名为“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, 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中的所有日期?