如果你想在與日期一些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);
這取決於你的定義和如何您的帳戶特殊情況。示例您可以說任何差異> = 30天是每月,任何差異> = 365天的內容每年,但這可能會在31天月份和閏年的第一天和最後一天失敗。您可以擴展規則以添加,那些日期中的月份/年份不一樣。這不是一個SQL問題是一個必需的問題 – jean
如果你可以確定'日'將在任何給定的頻率是相同的,那麼解決方案將減少到檢查「月」(和「年」 )部分的日期。 事實上......即使每天移動大約3天(左右),您也可以進行計算並忽略這些日子。 即...'2017-01-13'和'2017-04-13'之間的頻率爲'4 - 1 = 3'(季度)。 –