【问题标题】:Get Year of Previous Month (For Jan 1st)获取上个月的年份(对于 1 月 1 日)
【发布时间】:2016-01-22 15:17:32
【问题描述】:

我目前正在 SSRS 中构建 YTD 报告。我希望在日历选择中编辑默认的“FROM”日期。

我希望检索前几个月的 1 月 1 日。例如:

(如果是 2016 年 2 月 16 日 .. 结果应该是 1/1/2016

如果是 2016 年 1 月 10 日 .. 结果应该是 1/1/2015)

我构建它是为了检索 1 月 1 日的当前年份,但如果我们在 1 月,它会导致问题,因为我需要它来检索上个月的年份(在这种情况下,它将是 2015 年,而不是 2016 年)。

谢谢!

【问题讨论】:

  • 可能是这样的?年(DateAdd(m,-1,Parameter!myParameter.Value))
  • 请 google 并了解 SSRS 中的表达式。您可以为参数的默认值编写表达式。

标签: sql sql-server reporting-services


【解决方案1】:

试试这个,应该可以的

=DateAdd(DateInterval.Month,-1,DateSerial(Year(Today), Month(Today), 1))

更新:

根据您的评论,我创建了这个表达式。它未经测试,但应该可以工作。

=IIF(Today.Month>1,
DateAdd(DateInterval.Month,-1,DateSerial(Year(Today), Month(Today), 1)),
DateAdd(DateInterval.Year,-1,DateSerial(Year(Today), Month(Today), 1))
)

如果这有帮助,请告诉我。

【讨论】:

  • 我在起始日期参数中对此进行了测试,但结果是 2015 年 12 月 1 日。我正在寻找基于上个月的 2015 年 1 月 1 日。谢谢!
  • 您的更改使我看到了 2015 年 1 月 1 日,就像 1 月一样,但是当我将系统时钟更改为 2 月时,我仍然看到 2015 年 1 月 1 日。当此报告读取 2 月系统时间时,它应该会显示 2016 年 1 月 1 日,因为前几个月现在将变为 2016 年。
  • 尝试使用硬编码日期而不是更改系统日期。即CDate("2016-02-15")。将Today 替换为您要测试的日期。
  • 我其实发现了一个问题。我以为我的报告是在我的机器上本地托管的,但它实际上是在服务器上。这意味着我对您的查询的测试很糟糕,因为我的系统时间没有改变(因为重要的是服务器系统时间)。由于现有报告/任务/等,我无法更改我的服务器系统时间 - 有没有办法可以人工测试您的方法?
  • 查看我之前的评论。将Today 替换为CDate("2016-02-15")
【解决方案2】:
select cast(cast(year(dateadd(mm, -1,getdate())) as varchar)+'-01-01' as date)

将 getdate() 替换为您基于此计算的任何字段。

用于测试:

select cast(cast(year(dateadd(mm, -1,'2015-01-22')) as varchar)+'-01-01' as date)
select cast(cast(year(dateadd(mm, -1,'2016-02-01')) as varchar)+'-01-01' as date)
select cast(cast(year(dateadd(mm, -1,'2015-12-12')) as varchar)+'-01-01' as date)

【讨论】:

    【解决方案3】:

    我们想使用具有格式的日期序列 =DateSerial(YYYY,MM,DD) 月份总是一月 日子永远是第一天 如果月份是一月,那就是去年。否则就是今年。 因此,假设我们有一个带有名为 Date 参数的 SSRS 报告,我们可以为您的一月日期创建一个新字段,如下所示:

    =iif(Month(Parameters!Date.Value)=1, 
        dateserial(Year(Parameters!Date.Value)-1,1,1),
        dateserial(Year(Parameters!Date.Value),1,1))
    

    如果您想在使用 T-SQL(2012 版)或更高版本的查询中执行此操作:

    case when month(@DATE) = 1 
        then DATEFROMPARTS(YEAR(@DATE)-1,1,1)
        else DATEFROMPARTS(YEAR(@DATE),1,1) 
     end
    

    或者,在早期版本中

      CASE WHEN MONTH(@DATE) = 1 
            THEN CAST(CAST((YEAR(@DATE)-1)*10000 + 101 AS CHAR(8)) AS DATE) 
            ELSE CAST(CAST((YEAR(@DATE)*10000+ 101) AS CHAR(8)) AS DATE) 
        END
    

    【讨论】:

      猜你喜欢
      • 2017-06-08
      • 1970-01-01
      • 1970-01-01
      • 2014-04-02
      • 1970-01-01
      • 1970-01-01
      • 2020-11-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多