【问题标题】:Get first Saturday of month and last Friday of last week of month获取每月的第一个星期六和每月最后一周的最后一个星期五
【发布时间】:2012-12-21 18:01:09
【问题描述】:

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

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

开始日期:10/06/2012 结束日期:2012 年 11 月 2 日

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

开始日期:2012 年 12 月 1 日 结束日期:01/04/2013

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

【问题讨论】:

  • 我不知道Visual Studio报表设计器,但是听起来End参数也可以定义为:“last这个月的星期六加 六天”。这也是:“下一个月的第 6 天或之前的最后一个星期五”。不知道有没有帮助?

标签: datetime reporting-services report-designer


【解决方案1】:

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

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

  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 表达式 有点受限。上面的示例也可以调整为“每月最后一周的星期五”。

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

【讨论】:

  • Jeroen,感谢您有条不紊地完成了这个过程。它有助于了解您是如何推理的。我也可以使用相同的方法来获取结束日期。
  • 除了 SQL 之外,我不是什么程序员。我不知道 FirstDayOfWeek 命令。感谢您的回答。
【解决方案2】:

这是我第一部分的内容。可能有更好的方法来实现这一点。我所做的是获取当前月份并从中减去一个。然后我将日期和当前年份连接到月份。然后我检查了当天的名称,看看是不是星期六。如果是,那么我使用了那个日期。否则我第二天用同样的检查,依此类推。如果你想使用它,如果你在一月份,你需要添加额外的逻辑。您还可以将 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'

【讨论】:

  • 尼尔,感谢您的帮助。我做过嵌套的 IIF,但从来没有那么多! ;-)
  • 感谢你们(Neil 和 Jeroen)。我已经设法按摩你的例子,以获得上个月最后一周的第一个星期六和星期五。 (我们总是按一个月计费。)我想选择两个答案作为接受的答案,因为我确实遇到了两个问题,并使用您的示例代码解决了每个问题。
【解决方案3】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多