2016-06-28 53 views
2

私はYRMO (Year/Month Ex:201606)列を使って製品の年齢を調べようとしています。私は、製品、Yrmoを持ってできるようにしたいと年齢:年月の列を使用して年齢を計算する方法は?

Product | YrMo | Age| 
A  | 201602 | 1 | 
A  | 201603 | 2 | 
B  | 201605 | 4 | 

私はDATETYPEを使用する場合、私はこの方法を使用するが、結果

SELECT 
     Product  
    , YrMo 
    , [Month_#] = DATEDIFF(MONTH,201601,YrMo) 

FROM Table 

を取得することができませんでしたそれは連続した月を返しました:

[Month_#] = DATEDIFF(MONTH,'1900-01-01',YrMo) 

代わりにこれを回避する方法についてのヒント?

+1

「年齢」の理由は、現在の日付ではなく、2016年の1月と比べてどうですか? –

+0

「年齢」は、連続する月を識別するために、年の月の列と別の日付の日付の差です。 – Swazzy

答えて

1

シンプル

SELECT Product, 
     YrMo, 
     DATEDIFF(month,STUFF(YrMo,5,0,'-')+'-01','2016-01-01') as Age 
FROM YourTable 

出力:

Product YrMo Age 
A  201602 1 
A  201603 2 
B  201605 4 
+1

与えられた年の月を計算しているのにうまくいきますが、201501から月を計算したいとしますか? 201601-201501 = 100? 12ヶ月ではない – Swazzy

+0

それは意味があります:) YYYYMMDDの日付リテラルは実際には 'DATEDIFF(月、(YrMo + '01 ')、')というダッシュを必要としない、 – gofr1

+1

のSQL Server用に変更されました。 20160101 ') ' –

1
SELECT product, 
     yrmo, 
     [Month_#] = Datediff(month, Cast('1900-01-01' AS DATE), Cast( 
        '20160101' AS DATE) 
        ) 
FROM table 
+1

開始日から日付を取得しようとしていますか(それは年月の列と見なします)、別の抽象日付とyrmo列の日付の差ですか? – Mark

+0

はい、これは年の月の列です。私はそれと抽象的な日付(1900-01-01)の日付差を取得したいと思いました。私の質問に言い換えてくれてありがとう – Swazzy

+0

ああ、私はそれに応じて編集しました。がんばろう! – Mark

1

あなたのクエリとの緊密ですが、あなただけの日付にintまたは6桁の文字列をキャストすることはできません。

select 
    Product  
    , YrMo 
    , [Month_#] = datediff(month, cast(cast(201601 as varchar(11)) + '01' as date), cast(cast(YrMo as varchar(11)) + '01' as date)) 
from Products 

結果::私はvarchar型にint型をキャストし、それ完全な日付にするために「01」を付加しています

Product YrMo Month_# 
A  201602 1 
A  201603 2 
B  201605 4 

注意をここにあなたのクエリが変更され、です。実際に使用しているデータ型によっては、おそらくこれをもっときれいにすることができます。

1
DECLARE @T TABLE (Product VARCHAR(1), YrMo INT, Age INT) 
INSERT INTO @T VALUES 
('A',   201602 , 1) , 
('A' ,  201603 , 2), 
('B' ,  201605 , 4) 


    SELECT  AGE, YRMO, 
       (YRMO/100 * 12 + YRMO % 100) - (201601 /100 *12 + 201601 % 100) AS AGE 
    FROM @T 
関連する問題