MMYYYY与YYYYMMDD相比

时间:2016-06-08 12:39:59

标签: sql sql-server

我将日期存储为db中的字符(我知道,但它不是我的数据库,也不是我的想法......)。

其中一个日期存储为MMYYYY(012016,022016 ...),第二个存储为YYYYMMDD(20160101,20160202 ...)。

有没有办法比较这些日期?我需要选择一个日期并选择所有第二个日期,这些日期比第一个日期早至少一年......

感谢您的帮助!

因此,例如,我有Date1字段,其值为:012014,012015,012016 和Date2字段的值:20141005

我只需要Date1,它比Date2早至少一年,所以在这种情况下它只会返回012016

3 个答案:

答案 0 :(得分:3)

我制作了两个function playSound(val) { var soundToPlay = document.getElementById("sound"+val); // lowerCase "d" required soundToPlay.play(); } 来展示如何解决这个问题。我假设cte存储为MMYYYYnvarcharvarchar属于同一类型。如果不是 - 您需要在YYYYMMDD字段进行一次/几次转换。

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

答案 1 :(得分: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) 

答案 2 :(得分: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))