我将日期存储为db中的字符(我知道,但它不是我的数据库,也不是我的想法......)。
其中一个日期存储为MMYYYY(012016,022016 ...),第二个存储为YYYYMMDD(20160101,20160202 ...)。
有没有办法比较这些日期?我需要选择一个日期并选择所有第二个日期,这些日期比第一个日期早至少一年......
感谢您的帮助!
因此,例如,我有Date1字段,其值为:012014,012015,012016 和Date2字段的值:20141005
我只需要Date1,它比Date2早至少一年,所以在这种情况下它只会返回012016
答案 0 :(得分:3)
我制作了两个function playSound(val) {
var soundToPlay = document.getElementById("sound"+val); // lowerCase "d" required
soundToPlay.play();
}
来展示如何解决这个问题。我假设cte
存储为MMYYYY
或nvarchar
,varchar
属于同一类型。如果不是 - 您需要在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))