2016-08-15 64 views
0

在SQL中,我有一个条件从YYYYMM值中减去一个月。请帮助我。我能得到答案下面从yearmon减去月份

select 201608 - 1; 

但是,当它是01月,它不工作。

帮我解决这个问题,如果条件不检查01个月!

我还通过DATADD和DATEDIFF函数去了,但能不能得到结果如预期

+0

您使用PostgreSQL或SQL Server吗?你已经标记了两个。 – Nicarus

+0

这不是“yearmonth”。这是一个整数。你不能指望你使用的任何数据库都很聪明,并且认识到它是什么。你必须告诉数据库这是一个日期/时间值。直到你这样做,你所做的只是分析两个常规数字,数据库将很乐意执行标准算术。 –

+0

Iam使用SQL Server,错误地选择了Postgre – CIPHER

回答

3
Select DateAdd(MM,-1,cast(cast(201608 as varchar(10))+'01' as date)) 

返回的2016年7月1日

+0

@CIPHER您是否希望将它作为int 201607? –

+0

@Cappelletti - 我得到了你的建议,谢谢你的答案 'Select substring(convert(varchar(10),DateAdd(MM,-1,cast(cast(201608 as varchar(10))+' 01'as date)),11​​2),1,6)' – CIPHER

+0

@CIPHER干得好你可以通过CONVERT排除子字符串(INTEGER,CONVERT(VARCHAR,DateAdd(MM,-1,cast(cast(201608 as varchar ))+'01'as date)),11​​2))/ 100 –

0

SQL包含日期操作功能。使用这些:

SELECT DATEDIFF(DAY, DATEADD(day, -1, @dateToCheck), GETDATE())

+0

这是一个T-SQL示例 - 用MS SQL和使用不同语法的Postgres标记了您的问题 – Wes

0

日期或者您可以使用一些数学为INT转换成基地12 INT,一个月。减去并返回到原始编码。

select d, m, res=(dd/12)*100 + dd%12 + 1 
from (
    select *, (d/100)*12 + d%100 - 1 - m as dd 
    from (--sample data, m = months to substract 
    values 
     (201608, 10), (201608, 2), (201601, 1), (201601, 12) 
    ) t(d,m) 
) t