[英]How to convert separate year and month column into a single date and get the difference between two dates in terms of months/days
[英]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
;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.