-2
SELECT DATEPART(YEAR, PURCHASE_DATE) AS TRANSACTION_YEAR, DATEPART(MONTH, PURCHASE_DATE) AS TRANSACTION_MONTH,
CASE WHEN DATEPART(YEAR, DUE_DATE) >= DATEPART(YEAR, PURCHASE_DATE) THEN DATEPART(YEAR, DUE_DATE)
ELSE DATEPART(YEAR, PURCHASE_DATE) END AS RELEASE_YEAR, 
CASE WHEN (DATEPART(YEAR, DUE_DATE) = DATEPART(YEAR, PURCHASE_DATE) AND DATEPART(MONTH, DUE_DATE) >= DATEPART(MONTH, PURCHASE_DATE)) THEN DATEPART(MONTH, DUE_DATE)
WHEN DATEPART(YEAR, DUE_DATE) > DATEPART(YEAR, PURCHASE_DATE) THEN DATEPART(MONTH, DUE_DATE)
ELSE
DATEPART(MONTH, PURCHASE_DATE) END AS RELEASE_MONTH,
CAST(YEAR(CASE WHEN DATEPART(YEAR, DUE_DATE) >= DATEPART(YEAR, PURCHASE_DATE) THEN DATEPART(YEAR, DUE_DATE)
ELSE DATEPART(YEAR, PURCHASE_DATE) END) AS VARCHAR(4)) + RIGHT('0'+CAST(MONTH(CASE WHEN (DATEPART(YEAR, DUE_DATE) = DATEPART(YEAR, PURCHASE_DATE) AND DATEPART(MONTH, DUE_DATE) >= DATEPART(MONTH, PURCHASE_DATE)) THEN DATEPART(MONTH, DUE_DATE)
WHEN DATEPART(YEAR, DUE_DATE) > DATEPART(YEAR, PURCHASE_DATE) THEN DATEPART(MONTH, DUE_DATE)
ELSE
DATEPART(MONTH, PURCHASE_DATE) END) AS VARCHAR(2)),2)
FROM TEST

6つのレコードのサンプルテーブルで、

2012    1   2012    1   190501
2012    1   2013    12  190501
2011    1   2012    1   190501
2011    1   2011    1   190501
2012    1   2012    1   190501
2012    1   2012    2   190501

私は何が間違っているのですか?

どうもありがとう!

4

2 に答える 2

2

CASE問題は、式を使用して月と年のコンポーネントを既に抽出しており、これらの式の結果を、値が渡されることを期待している関数YEARと関数に渡していることだと思います。したがって、 sを値に暗黙的に変換し直していることになります。MONTHdatetimeintdatetime

SELECT YEAR(2012)

----
1905

SELECT MONTH(12)

----
01

intが暗黙的にに変換される場合datetime、それは事実上、からの日数19000101です。190001011905年には、2000日を超えるほとんどの日が発生しました。


とはいえ、これはすべて必要以上に複雑に見えます-サブクエリを使用すると、繰り返す必要はなく、適切な計算を1回実行できます-最初の入力と目的の最終出力は何ですかにとって?

于 2012-07-07T13:48:04.963 に答える
0

なぜあなたはそれをすべて一度にやろうとしていて、あちこちで自分自身を繰り返しているのですか?

で始める場合

select 
DatePart(YEAR,PURCHASE_DATE) as PURCHASE_YEAR,
DatePart(YEAR,DUE_DATE) as DUE_YEAR,
DatePart(MONTH,PURCHASE_DATE) as PURCHASE_MONTH,
DatePart(MONTH,DUE_DATE) as DUE_MONTH
From Test

その後、あなたはすることができます

SELECT PURCHASE_Year AS TRANSACTION_YEAR, 
       PURCHASE_Month) AS TRANSACTION_MONTH,
       CASE 
       WHEN DUE_YEAR >= PURCHASE_YEAR THEN DUE_YEAR
       ELSE PURCHASE_YEAR
       END AS RELEASE_YEAR, 
       CASE 
       WHEN (DUE_YEAR = PURCHASE_YEAR) AND (DUE_MONTH >= PURCHASE_MONTH) THEN DUE_MONTH
       WHEN DUE_YEAR > PURCHASE_YEAR THEN DUE_MONTH
       ELSE PURCHASE_MONTH 
       END AS RELEASE_MONTH,
       CAST(
        CAST(RELEASE_YEAR As VarChar(4)) + 
        '-' + 
        CAST(RELEASE_MONTH as VarChar(2)) + 
        '-1' as DATE) as RELEASE_DATE
FROM (
select 
DatePart(YEAR,PURCHASE_DATE) as PURCHASE_YEAR,
DatePart(YEAR,DUE_DATE) as DUE_YEAR,
DatePart(MONTH,PURCHASE_DATE) as PURCHASE_MONTH,
DatePart(MONTH,DUE_DATE) as DUE_MONTH
From Test
) SomeDummyTableName

これがあなたが求めていたものだと思います、そして私はその泥沼を歩いた直後にそれを手に入れたかもしれません。

于 2012-07-07T14:05:06.343 に答える