2012-07-07 71 views
-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 

上的六個記錄樣本表產生鑄造給我錯誤的日期?

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 

我在做什麼錯?

非常感謝!

+2

這傷害了我的大腦。請構建一個更簡單的測試用例! – 2012-07-07 13:33:37

+1

我猜對了SQL Server。如果這是錯誤的,請適當修改您的標籤。你已經展示了一些輸出結果,但是你不知道你想要達到什麼目標(你沒有告訴我們)。另外,你正在處理的列的數據類型是什麼?告訴我們*什麼是錯的。 – 2012-07-07 13:35:03

+0

對不起,第五列給了我每個記錄相同的輸出,我不知道爲什麼? – 2012-07-07 13:40:12

回答

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 

我想這是你所追求的,並通過沼澤地跋涉之後我甚至有可能得到它。

+0

謝謝託尼,但我不得不使用的第三方軟件的侷限性之一是它有要一次性完成(而且工作表也不允許!)我知道的垃圾,但我只能用我得到的工具來工作:-(我懷疑我試圖實現不可能的事情。 – 2012-07-07 14:30:24

2

我認爲問題是,你已經提取使用CASE表達式月份和年份的組件 - 並通過這些表達式的YEARMONTH功能的結果 - 它希望傳遞一個datetime值。因此,您將導致將int s隱式轉換回datetime值。

SELECT YEAR(2012) 

---- 
1905 

SELECT MONTH(12) 

---- 
01 

int被隱式轉換爲datetime,它有效的,因爲19000101天數。大多數日子〜2000天以後19000101發生在1905年


所有這一切是說,這一切看起來很多複雜得多,它需要 - 使用子查詢,你可以進行一次相應的計算,而不是重複它們 - 初始輸入是什麼,以及你想要達到的最終輸出是什麼?

+0

感謝你的這一點,我想我將不得不重新編寫代碼 – 2012-07-07 13:50:53

+0

這必須在一個查詢中完成,因爲我使用的SQL第三方功能有限。我有一個兩列(購買日期,到期日期)和六個樣本記錄的簡單測試表.....我試圖將發佈月份(我的輸出的第三和第四列)放到YYYYMM的第五列格式。 – 2012-07-07 13:59:35

+0

@RastaPickles,只是爲你做了我認爲,不要以爲我現在會得到報酬:) – 2012-07-07 14:08:46