2016-06-08 173 views
1

我把日期存儲爲分貝的字符(我知道,但它不是我的分貝,也不是我的想法..)。MMYYYY與YYYYMMDD比較

其中一個日期存儲爲MMYYYY(012016,022016 ...),第二個存儲爲YYYYMMDD(20160101,20160202 ...)。

有沒有辦法比較這些日期?我需要採取一個日期,並選擇所有的第二個日期,這是至少比第一個更早的一年...

謝謝任何​​幫助!

因此,例如,我有價值觀日期1場:012014,012015,012016 和date2字段值:20141005

,我只日期1這是至少老了一歲,然後日期2所以在這種情況下,需要它將僅返回012016

+1

添加一些樣本表數據和預期的結果。 – jarlh

+1

哪一部分是你堅持,將它們轉換爲日期或比較它們作爲日期? –

+0

我堅持把它們轉換爲日期,以便我可以比較它們,比較部分是可以的 – Nightmaresux

回答

0

試試這個 column1存儲MMYYYY格式,而column2存儲YYYYMMDD。

where column1= case when datepart(month,taskDuedate)>9 then convert(varchar,datepart(month,taskDuedate))else '0'+convert(varchar,datepart(month,taskDuedate))end+convert(varchar,datepart(year,taskDueDate)) 
3

我做了兩個cte s來說明如何解決它。我假設MMYYYY存儲爲nvarcharvarcharYYYYMMDD是相同的類型。如果沒有 - 您需要在YYYYMMDD字段進行一次/幾次轉換。

;WITH cte AS (
SELECT '012016' as MMYYYY 
UNION ALL 
SELECT '022016' 
), cte2 AS (
SELECT '20160101' AS YYYYMMDD 
UNION ALL 
SELECT '20160202' 
) 

SELECT * 
FROM cte c 
INNER JOIN cte2 c2 
ON YYYYMMDD LIKE RIGHT(MMYYYY,4)+LEFT(MMYYYY,2) +'%' 

輸出:

MMYYYY YYYYMMDD 
012016 20160101 
022016 20160202 

編輯:

要找出幾年不同使用:

DATEDIFF(year,CAST(YYYYMMDD as date), CAST(RIGHT(MMYYYY,4)+LEFT(MMYYYY,2)+'01' as date)) 
1

可以這兩個字段轉換成DATE類型,然後比較它們。

對於MMYYYY,您可以使用功能DATEFROMPARTS()建立日期。例如,轉換成012014日期:

-- DATEFROMPARTS(year, month, day) 
DATEFROMPARTS(RIGHT('012014', 4), LEFT('012014', 2), 1) 

對於YYYYMMDD,更容易,因爲這是ISO格式與Time Style 112。您可以使用CONVERT()函數來執行轉換:

CONVERT(DATE, '20141005', 112) 

而這裏的最終查詢的樣子:

WITH casted AS (
    SELECT 
     DATEFROMPARTS(RIGHT(date1, 4), LEFT(date1, 2), 1) AS d1, 
     CONVERT(DATE, date2, 112) AS d2, 
     -- ... 
    FROM yourTable 
) 
SELECT * 
FROM casted 
WHERE d1 <= DATEADD(YEAR, -1, d2)