2

这种需求有点奇怪,我可以在 C# 中完成,但似乎无法为报表设计器获取正确的表达式语法。

我想为报告设置默认的开始和结束参数。为此,我需要一个月的第一个星期六和该月最后一周的星期五日期的“仅日期”值。这意味着后一个值实际上可以在下个月。所以对于 2012 年,我的价值观是这样的:

开始日期:10/06/2012 结束日期:11/02/2012

开始日期:11/03/2012 结束日期:11/30/2012

开始日期:2012 年 12 月 1 日结束日期:2013 年 1 月 4 日

我一直在使用 Month()、Weekday()、WeekdayName 等处理条件语句,但运气不佳。有没有人做过这样的事情?

4

3 回答 3

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
    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'
于 2012-12-21T19:40:34.407 回答
1

您可能不需要任何大量的条件语句。如果您这样做是为了模拟循环和其他命令式编程功能,那么在自定义代码中创建一个函数来执行此操作可能会更容易。

另一种方法是为您正在执行的特定计算寻找一种算法。例如,这个答案可以成为获得所需日期的重要基础,只需稍作调整即可。以下是“本月的第一个星期六”的工作方式:

  1. 本月第 1 天的星期几:

    =Weekday(DateAdd("d", 1 - Now().Day, Now()), FirstDayOfWeek.Sunday)
    
  2. 我们应该在该月的第一天加上多少天:

    =7 - Weekday(DateAdd("d", 1 - Now().Day, Now()), FirstDayOfWeek.Sunday)
    
  3. 所以这个月的第一个星期六的日期是:

    =DateAdd("d", 
         7 - Weekday(DateAdd("d", 1 - Now().Day, Now()), FirstDayOfWeek.Sunday),
         DateAdd("d", 1 - Now().Day, Now())
        )
    

可能有更聪明的方法可以做到这一点,尽管 VBScript 表达式有点有限。上面的示例也可以调整为“本月最后一周的星期五”。

底线:对您的问题的(间接但通用的)答案是考虑算法以达到您想要的日期(尽可能声明性,因为您不能轻松地在表达式中执行循环和内容)。

于 2012-12-24T09:46:27.090 回答
-1

获取上个月的最后一个星期五......

=DateAdd(DateInterval.Day,- Weekday(DateAdd("d", 1 - Now().Day, Now()), FirstDayOfWeek.Saturday), DateSerial(Year(Date.Now), Month(Date.Now), 1))

于 2014-12-12T12:04:35.173 回答