2016-08-15 9 views
0

В SQL У меня есть критерии для вычитания одного месяца из значения YYYYMM. Пожалуйста, помогите мне. Я могу получить ответ нижеВычесть месяц из yearmonth

select 201608 - 1; 

Но если это 01 месяц, это не работает.

Помогите мне в этом, не проверяя 01 месяц, если условие!

Я также прошел через функцию DATADD и DATEDIFF, но не смогла в состоянии получить результаты, как и ожидалось

+0

Вы используете PostgreSQL или SQL Server? Вы отметили оба. – Nicarus

+0

Это не «год месяца». это целое число. вы не можете ожидать, что какой-либо БД вы используете, чтобы быть умным и признать, что это такое. Вы должны сказать db, что это значение даты/времени. пока вы этого не сделаете, все, что вы делаете, - это два регулярных числа, которые db с радостью выполнит стандартную арифметику. –

+0

Iam Использование SQL Server, ошибочно выбран Postgre – CIPHER

ответ

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

Возвращает дату 2016-07-01

+0

@CIPHER Хотите ли вы вернуть его как int 201607? –

+0

@Cappelletti - Я получил ответ с помощью ваших предложений, спасибо тонну 'Выберите подстроку (конвертировать (varchar (10), DateAdd (MM, -1, cast (cast (201608 as varchar (10)) + ' 01 'в качестве даты)), 112), 1,6) ' – CIPHER

+0

@CIPHER Хорошо сделано Вы можете исключить подстроку через CONVERT (INTEGER, CONVERT (VARCHAR, DateAdd (MM, -1, cast (cast (201608 as varchar (10)) + '01' в качестве даты)), 112))/100 –

0

SQL содержит функции манипулирования даты. Используйте те:

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

+0

Это пример T-SQL - вы пометили свой вопрос как MS SQL, так и Postgres, который использует разные синтаксисы – Wes

0

В качестве альтернативы вы можете использовать некоторые математические для преобразования Int в основание 12 междунар, вычитать месяц и вернуться к исходному кодированию ,

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 
Смежные вопросы