簡體   English   中英

sql-如何獲取單個列的兩個日期之間的日期差異(以天為單位)

[英]sql - How to get the average of datediff in days between two dates of a single column

我認為這很容易,但是我能弄清楚的唯一方法是臨時表。 基本上,我有1列稱為“ myDate”,這是一個日期時間列,我想知道的是所有這些行的天平均差。

所以基本上結果是這樣

1/1/2014
1/14/2014
1/20/2014

所以基本上我想知道平均是9.5天。 1/1-1/14是13天,而14/20是6天,所以19/2是9.5

我的基本查詢是select myDate from myTable

平均值是最大值減去最小值,再除以天數減去一。 因此,您可以通過以下方式獲得它:

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()得出否定結果,則這些日期之間的持續時間將忽略該符號,即絕對值。 例如,如果我們計算datediff(day,2014-01-02,2013-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
;

參見: http : //sqlfiddle.com/#!6/a7cdc/4

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM