2017-08-16 203 views
0

在SQL Server中,我有兩個日期列x和y列,如果是月度,季度或日期,我想計算這兩個日期之間的頻率每年。SQL - 計算兩個日期之間的頻率(每月,每季度和每年)

我曾嘗試自己,但它似乎是不正確

代碼:

CASE WHEN ROUND(DATEDIFF(d, ISNULL(RV.[x], ''), ISNULL(RV.[y], ''))/30.0, 1) <= 1 THEN 'MONTHLY'  
    WHEN ROUND(DATEDIFF(d, ISNULL(RV.[x], ''), ISNULL(RV.[y], ''))/30.0, 1) BETWEEN 1 AND 3 THEN 'QUARTERLY' 
    ELSE 'ANNUALLY' 
END FREQUENCY 

我將不勝感激,如果有人能幫助我正確的代碼這一點。

謝謝你,非常感謝

+0

這取決於你的定義和如何您的帳戶特殊情況。示例您可以說任何差異> = 30天是每月,任何差異> = 365天的內容每年,但這可能會在31天月份和閏年的第一天和最後一天失敗。您可以擴展規則以添加,那些日期中的月份/年份不一樣。這不是一個SQL問題是一個必需的問題 – jean

+0

如果你可以確定'日'將在任何給定的頻率是相同的,那麼解決方案將減少到檢查「月」(和「年」 )部分的日期。 事實上......即使每天移動大約3天(左右),您也可以進行計算並忽略這些日子。 即...'2017-01-13'和'2017-04-13'之間的頻率爲'4 - 1 = 3'(季度)。 –

回答

0

如果你想在與日期一些NULL值的模擬數據運行它,那麼你會注意到DATEDIFF有時會返回負值。
這將使CASE返回「MONTHLY」,原因是錯誤的。

只是不要做ISNULL的。這樣DATEDIFF將只返回NULL,並被評估爲「ANNUALLY」。

另外,您也可以在f.e.中獲得DATEDIFF。幾個月,這可能會簡化您的查詢。

declare @TestTable table (x date, y date); 

declare @y date = '2017-08-15'; 

insert into @TestTable (x,y) values 
(dateadd(day,-10,@y),@y), 
(dateadd(day,-30,@y),@y), 
(dateadd(day,-60,@y),@y), 
(dateadd(day,-240,@y),@y), 
(null,@y), 
(dateadd(month,-2,@y),null); 

select RV.*, 
/* 
DATEDIFF(day, RV.[x], RV.[y]) as monthdiff, 
DATEDIFF(month, RV.[x], RV.[y]) as monthdiff, 
DATEDIFF(quarter, RV.[x], RV.[y]) as quarterdiff, 
DATEDIFF(year, RV.[x], RV.[y]) as yeardiff, 
*/ 
CASE 
WHEN DATEDIFF(month, RV.[x], RV.[y]) = 0 THEN 'MONTHLY' 
WHEN DATEDIFF(quarter, RV.[x], RV.[y]) = 0 THEN 'QUARTERLY' 
WHEN DATEDIFF(year, RV.[x], RV.[y]) = 0 THEN 'ANNUALLY' 
ELSE 'ANNUALLY?' 
END FREQUENCY 
from @TestTable RV; 

返回:

x   y   FREQUENCY 
---------- ---------- ---------- 
2017-08-05 2017-08-15 MONTHLY 
2017-07-16 2017-08-15 QUARTERLY 
2017-06-16 2017-08-15 ANNUALLY 
2016-12-18 2017-08-15 ANNUALLY? 
NULL  2017-08-15 ANNUALLY? 
2017-06-15 NULL  ANNUALLY? 

檢查也是本次測試SQL的結果:

select RV.*, 
DATEDIFF(day, x, y) as daydiff, 
DATEDIFF(month, x, y) as monthdiff, 
DATEDIFF(quarter, x, y) as quarterdiff, 
case when DATEDIFF(quarter, RV.[x], RV.[y]) = 0 then 'yes' else 'no' end as same_quarter 
from (values 
('2017-01-15','2017-03-31'), 
('2017-01-15','2017-04-01') 
) as RV(x,y); 
+0

謝謝你們提供的答案。有趣的答案。非常感謝 –

+0

@SatyenGotecha對不起,犯了一個邏輯錯誤。查看更新版本。 – LukStorms

+0

@LukStorms從邏輯上講,比較陳述毫無意義。但是,我確實意識到這是OP的結轉。 (月,RV。[x],RV。[y])= 1 THEN'MONTHLY'WHEN DATEDIFF(month,RV。[x], RV。[y])= 3 THEN'QUARTERLY'...',然後如果年份差異是1,那麼就是'YEARLY'。 –

相關問題