这个需求有点奇怪,我可以在C#中完成,但似乎无法使报表设计器的表达式语法正确。
我想为报告设置默认的开始和结束参数。为此,我需要一个月的第一个星期六的“仅限日期”值,以及该月最后一周的星期五日期。这意味着后一个值实际上可能在下个月。因此,对于2012年,我的价值观将如下所示:
StartDate:10/06/2012 EndDate:11/02/2012
StartDate:11/03/2012 EndDate:11/30/2012
StartDate:12/01/2012 EndDate:01/04/2013
我一直在使用Month(),Weekday(),WeekdayName等处理条件语句,但没有好运。有人做过这样的事吗?
答案 0 :(得分:1)
这是我第一部分的内容。可能有更好的方法来实现这一目标。我所做的是获得当前月份并从中减去一个月份。然后我将日期和当前年份连接到月份。然后我检查了当天的名字,看看是否是星期六。如果是,那我就用那个日期。否则我第二天用相同的支票做了,依此类推。如果您想使用它,如果您在1月份,则需要为其添加额外的逻辑。你也可以用你正在使用的参数替换NOW()。
=IIF( WeekdayName(DatePart("w", (CDate((Month(NOW()) - 1) & "/1/" & YEAR(NOW()))))) = "Saturday", (CDate((Month(NOW()) - 1) & "/1/" & YEAR(NOW()))),
(IIF( WeekdayName(DatePart("w", (CDate((Month(NOW()) - 1) & "/2/" & YEAR(NOW()))))) = "Saturday", (CDate((Month(NOW()) - 1) & "/2/" & YEAR(NOW()))),
(IIF( WeekdayName(DatePart("w", (CDate((Month(NOW()) - 1) & "/3/" & YEAR(NOW()))))) = "Saturday", (CDate((Month(NOW()) - 1) & "/3/" & YEAR(NOW()))),
(IIF( WeekdayName(DatePart("w", (CDate((Month(NOW()) - 1) & "/4/" & YEAR(NOW()))))) = "Saturday", (CDate((Month(NOW()) - 1) & "/4/" & YEAR(NOW()))),
(IIF( WeekdayName(DatePart("w", (CDate((Month(NOW()) - 1) & "/5/" & YEAR(NOW()))))) = "Saturday", (CDate((Month(NOW()) - 1) & "/5/" & YEAR(NOW()))),
(IIF( WeekdayName(DatePart("w", (CDate((Month(NOW()) - 1) & "/6/" & YEAR(NOW()))))) = "Saturday", (CDate((Month(NOW()) - 1) & "/6/" & YEAR(NOW()))),
(IIF( WeekdayName(DatePart("w", (CDate((Month(NOW()) - 1) & "/7/" & YEAR(NOW()))))) = "Saturday", (CDate((Month(NOW()) - 1) & "/7/" & YEAR(NOW()))),
"1/1/2010")))))))))))))
另一方面,如果你在SQL Server中有一个日历表(特别是在你需要星期五的时候),将有一个非常简单的方法来获得这个。您可以执行一个简单的select语句,如下所示:
SELECT
MIN(date)
FROM
calendar c
WHERE
MONTH(DATEADD("m", -1, GETDATE())) = MONTH(date)
AND YEAR(DATEADD("m", -1, GETDATE())) = YEAR(date)
AND datename(dw, date) = 'Saturday'
答案 1 :(得分:1)
您可能不需要任何重大的条件陈述。如果您正在模拟循环和其他命令式编程功能,那么在Custom Code中创建函数可能更容易。
一个替代方法是为您正在进行的特定计算寻找算法。例如,this answer可以是获得所需日期的绝佳基础,无论是稍微调整一下。以下是“本月的第一个星期六”:
的效果本月第1天的星期几:
=Weekday(DateAdd("d", 1 - Now().Day, Now()), FirstDayOfWeek.Sunday)
我们应该在该月的第一天添加多少天:
=7 - Weekday(DateAdd("d", 1 - Now().Day, Now()), FirstDayOfWeek.Sunday)
所以这个月的第一个星期六的日期是:
=DateAdd("d",
7 - Weekday(DateAdd("d", 1 - Now().Day, Now()), FirstDayOfWeek.Sunday),
DateAdd("d", 1 - Now().Day, Now())
)
甚至可能有更聪明的方法来做到这一点,尽管VBScript表达式 有点受限。可以调整上面的示例以获得“本月最后一周的星期五”。
底线 :您的问题的(间接的,但通用的)答案是考虑到达您想要的日期的算法(如声明为可能,因为你不能轻易地在表达式中做循环和填充。)
答案 2 :(得分:-1)
获取上个月的上个星期五.....
= DateAdd(DateInterval.Day, - Weekday(DateAdd(" d",1 - Now()。Day,Now()),FirstDayOfWeek.Saturday),DateSerial(Year(Date.Now) ,月(Date.Now),1))