2017-02-15 2 views
-1

Ich habe eine Tabelle mit Spalten ReportJahr und ReportMonat. Für reportyear ist die Spalte ein vharchar (4), das dem Jahr 2016-Format entspricht. Für reportmonth ist es ein varchar (2), das ein 01, 02, 03 usw. Format hat. Ich habe einen Datenparameter, der die beiden verkettet, da unsere Endbenutzer ein Dropdown-Datum wünschen. Also mein Parameter ist @ReportDate varchar (7).Monat von VARCHAR Jahr und Datum abziehen Parameterformat '2016-11'

Mein Problem ist für eine meiner Auswahlen in meiner gespeicherten Prozedur, ich muss eine WHERE-Klausel setzen, wo es einen Monat zurückgeht. Wenn also mein Parameter gleich '2016-11' ist, möchte ich eine where-Klausel, die '2016-10' zurückgibt. Ich habe erfolgreich diese mit der fließenden Abfrage getan:

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

Das gibt ‚2016-10‘, wenn ich ‚2016-11‘ wie jeden Bericht Datum Parameter wählen. Aber nach weiterem Nachdenken würde dies nicht funktionieren, wenn mein Berichtdatum im Januar ist, weil die obige Abfrage nur einen String-Wert subtrahiert. Wenn ich '2016-01' auswähle, würde die obige Abfrage '2016-0' zurückgeben.

Antwort

0

Beispiel:

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

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

Returns

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

Endbenutzer möchten die Dropdown-Parameter in SSRS mit Bindestrichen sein, deshalb habe ich es als varchar (7) deklariert, um das Bindestrich @John Cappelletti – Lisbon

+0

@Lisbon ich aktualisiert, um den Bindestrich enthalten, wenn ich den Kommentar sah. Der varchar (7) vs varchar (10) ist kein Problem –

0

Sie können nur case verwenden:

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

SQL Server werden die Strings als Ints behandeln - ohne Konvertierung Fehler für Ihre Werte. concat() wandelt sie dann wieder in Strings um.

EDIT:

Ich sehe, das ist rückwärts. Fügen wir eine der Spalten in der Tabelle und vergleichen zu @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 
    ) 

Aber danach bedenkt, ich denke, Sie eine berechnete Spalte verwendet werden soll:

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

Dann tun einfach:

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

natürlich können Sie den expliziten Vergleich tun:

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

Beachten Sie, dass beide davon ausgehen, dass @reportdate eine Zeichenfolge ist.

+0

Mein Parameter ist AtReportDate, die eine Verkettung von Reportyear und Reportmonth Spalte ist. Also in meiner where-Klausel habe ich es als: wo reportyear + '-' + reportmonth = @ReportDate (ReportDate ist '2016-11') – Lisbon