SSRS:确定不包括周末的月度日期

时间:2016-09-12 12:58:36

标签: sql-server date reporting-services

我正在尝试创建一个报告,根据所选的报告月份生成月度日期。截止日期是该月的20日,除非该日期是周末或假日。我可能可以排除假期,但是如何编写表达式来拉动它呢?

参数将报告月份,整数和报告年份。

在Crystal之前创建报告的人使用了这个公式:

如果DayofWeek({@ Apr Due Date})= 1,那么{@Apr Due Date} + 1 else 如果DayofWeek({@ Apr Due Date})= 7那么({@Apr截止日期} + 2)否则{@Apr截止日期}

但我试图看看是否有办法让一个表达式覆盖参数中输入的任何月份。

我正在使用Report Builder 3.0和tsql。提前谢谢!

2 个答案:

答案 0 :(得分:0)

select cast(dateadd(day,20 - day(getdate()),getdate()) as date)

中获得20个非周末日
DECLARE @DAY_IN_MONTH DATE = '2016-09-09';   --any date in any month


WITH DS AS (SELECT DATEADD(day, 1 - DAY(@DAY_IN_MONTH),@DAY_IN_MONTH) AS DAY20
            UNION ALL
            SELECT dateadd(day,1,DAY20) FROM DS WHERE DAY(DAY20) < 31),
    DS2 AS (SELECT *,row_number() OVER (ORDER BY DAY20) RN FROM DS WHERE  LEFT(DATENAME(dw,DAY20),3) NOT IN ('SAT', 'SUN'))
    SELECT DAY20 FROM DS2 WHERE rn = 20;

答案 1 :(得分:0)

假设您的系统的第一天是Sunday,而最后一天是星期六,就像Crystal Report表达式中的那样。

您有两个参数:

Year  - Integer
Month - Integer

截止日期总是每月20天。

创建一个名为NoHolidayDueDate的附加参数,并将其设置为Hidden。对Default Value属性使用以下表达式。

这应该在SSRS表达式中应用该逻辑。

=Switch(
DateSerial(Parameters!Year.Value,Parameters!Month.Value,20).DayOfWeek = DayOfWeek.Saturday,
DateSerial(Parameters!Year.Value,Parameters!Month.Value,22),
DateSerial(Parameters!Year.Value,Parameters!Month.Value,20).DayOfWeek = DayOfWeek.Sunday,
DateSerial(Parameters!Year.Value,Parameters!Month.Value,21),
true,DateSerial(Parameters!Year.Value,Parameters!Month.Value,20)
)

然后在您的查询中使用NoHolidayDueDate这样的内容:

WHERE [Date] < @NoHolidayDueDate

如果有帮助,请告诉我。