我正在尝试创建一个报告,根据所选的报告月份生成月度日期。截止日期是该月的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。提前谢谢!
答案 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
如果有帮助,请告诉我。