2017-02-15 12 views
-1

У меня есть таблица, в которой есть столбцы reportyear и reportmonth. Для отчетного года столбец представляет собой vharchar (4), который соответствует формату 2016 года. Для reportmonth это varchar (2), который имеет формат 01, 02, 03 и т. Д. У меня есть параметр данных, который объединяет два, так как нашим конечным пользователям требуется выпадающая дата. Поэтому мой параметр @ReportDate varchar (7).Вычесть месяц из формата года и даты varchar '2016-11'

Моя проблема заключается в одном из моих вариантов в моей хранимой процедуре, мне нужно поставить предложение where, где оно возвращается месяц. Поэтому, если мой параметр равен «2016-11», мне нужно предложение where, где оно возвращает «2016-10». Я успешно сделал это, используя плавную запрос:

SUBSTRING(@Reportdate, 1, 4) + '-' + cast(substring(@ReportDate, 6, 7) -1 as varchar(20)) 

Это возвращает «2016-10», если я выбираю «2016-11» в качестве какого-либо параметра даты отчета. Но, если подумать, это не сработает, если моя дата отчета будет в январе, потому что вышеупомянутый запрос буквально вычитает строковое значение. Поэтому, если я выберу «2016-01», вышеуказанный запрос вернет «2016-0».

ответ

0

Для примера:

Declare @Reportdate varchar(7) = '2016-01' 

Select AsDate = dateadd(MM,-1,@ReportDate+'-01') 
     ,AsSting = left(convert(date,dateadd(MM,-1,@ReportDate+'-01'),101),7) 

Возвращает

AsDate  AsSting 
2015-12-01 2015-12 
+0

Конечные пользователи хотят, чтобы в SSRS были дефисы с дефисами, поэтому я объявил его как varchar (7), чтобы включить dash @John Cappelletti – Lisbon

+0

@Lisbon Обновлен, чтобы включить тире, когда я увидел комментарий. Varchar (7) vs varchar (10) не является проблемой –

0

Вы можете просто использовать case:

select concat(@ReportYear - 1, 
       (case when @ReportMonth = '01' then '12' 
        else right(concat('0', @ReportMonth - 1)) 
       end) 
      ) 

SQL Server будет обрабатывать строки как Интс - без преобразования ошибки для ваших значений. concat() затем преобразует их обратно в строки.

EDIT:

Я вижу, это в обратном направлении. Давайте добавим один к столбцам в таблице и сравните @Report_Month:

where (reportmonth = 12 and 
     right(@ReportDate, 2) = '01' and left(@Report_date, 4) = reportyear + 1 
    ) or 
     (left(@ReportDate, 4) = reportyear and 
     right(@ReportDate, 2) = reportmonth + 1 
    ) 

Но после рассмотрения этого, я думаю, вы должны использовать вычисляемый столбец:

alter table t add reportdate as (datefromparts(reportyear, reportmonth, 1)); 

Тогда просто сделать:

where dateadd(month, 1, reportdate) = cast(@reportdate + '01' as date) 

Конечно, вы можете сделать явное сравнение:

where (dateadd(month, 1, datefromparts(reportyear, reportmonth, 1)) = 
     cast(@reportdate + '01' as date) 
    ) 

Обратите внимание, что оба они предполагают, что @reportdate является строкой.

+0

Мой параметр atReportDate, который является конкатенацией столбца Reportyear и reportmonth. Так что в моей статье, где я предлагаю, у меня есть: где reportyear + '-' + reportmonth = @ReportDate (ReportDate is '2016-11') – Lisbon