を高く評価し、あなたと多くをありがとうございます。
その理由は、間違った理由で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);
それはあなたの定義に依存し、どのようにあなたが特別な例を占めています。例diff> = 30日は毎月、diff> = 365日は毎年ですが、これは31日の最初と最後の日とうるう年に失敗する可能性があります。追加するルールを拡張することができ、その日付の月/年は同じではありません。それはSQLの質問ではなく、必要なものです – jean
'Day'が任意の周波数で同じになることが確かであれば、解決策は' Month'(と 'Year' )の日付の部分。 実際、日が+/- 3日ぐらいになっても、計算を実行して日を無視することができます。 ... '2017-01-13'と '2017-04-13'の間の頻度は '4 - 1 = 3'(四半期)です。 –