2017-02-15 71 views
-1

我有一個表有列reportyear和reportmonth。對於reportyear,該列是一個vharchar(4),等於2016年格式。對於reportmonth,它是一個具有01,02,03等格式的varchar(2)。由於我們的最終用戶需要一個下拉日期,因此我有一個數據參數將兩者連接起來。所以我的參數是@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)以包含破折號@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()將它們轉換回字符串。

編輯:

我看,這是倒退。讓我們添加一個在表中的列,並比較@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列的串聯。因此,在我的where子句中,我將它定義爲: where reportyear +' - '+ reportmonth = @ReportDate(ReportDate is'2016-11') – Lisbon

相關問題