2016-06-08 170 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)