Datetime 获取本月的第一个星期六和本月最后一周的最后一个星期五

Datetime 获取本月的第一个星期六和本月最后一周的最后一个星期五,datetime,reporting-services,report-designer,Datetime,Reporting Services,Report Designer,这种需求有点奇怪,我可以在C#中实现,但似乎无法为报表设计器获得正确的表达式语法 我想为报表设置默认的开始和结束参数。为此,我需要一个月的第一个星期六和该月最后一周的星期五的“仅日期”值。这意味着后一个值实际上可能在下个月。2012年,我的价值观如下: 开始日期:2012年6月10日 截止日期:2012年2月11日 开始日期:2012年3月11日 截止日期:2012年11月30日 开始日期:2012年1月12日 截止日期:2013年4月1日 我一直在使用Month()、Weekday()、Wee

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

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

开始日期:2012年6月10日 截止日期:2012年2月11日

开始日期:2012年3月11日 截止日期:2012年11月30日

开始日期:2012年1月12日 截止日期:2013年4月1日


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

这是我第一部分得到的。也许有更好的方法来实现这一点。我所做的是得到当前月份并从中减去一个。然后我将日期和当前年份连接到月份。然后我查了一下那天的名字,看看是不是星期六。如果是的话,我就用那个日期。否则,第二天我就用同样的支票,以此类推。如果你想使用它,如果你在一月份,你需要添加额外的逻辑。您还可以用正在使用的参数替换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天的星期几:

    =工作日(DateAdd(“d”,1-Now().Day,Now()),FirstDayOfWeek.Sunday)
    
  • 我们应该在每月的第一天增加多少天:

    =7-工作日(DateAdd(“d”,1-Now().Day,Now()),FirstDayOfWeek.Sunday)
    
  • 因此,本月第一个星期六的日期为:

    =DateAdd(“d”,
    7-工作日(DateAdd(“d”,1-Now().Day,Now()),星期一的第一天,星期日),
    DateAdd(“d”,1-Now().Day,Now())
    )
    
  • 也许有更聪明的方法可以做到这一点,尽管VBScript表达式有点有限。上面的例子也可以调整为“本月最后一周的星期五”


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

    获得上个月的最后一个星期五


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

    我不知道Visual Studio报表设计器,但听起来End参数也可以定义为:“一个月的最后一个星期六加上六天”。也就是:“下个月第6天或之前的最后一个星期五”。不知道这是否有帮助?Jeroen,谢谢你有条不紊地完成了。这有助于了解你是如何推理的。我也可以使用同样的方法来获取结束日期。除了SQL之外,我算不上是一个程序员。我不知道星期一的命令。谢谢你的回答。尼尔,谢谢你的回答。我做过嵌套IIF,但从来没有那么多!!;-)感谢你们两位(尼尔和杰伦)。我已经设法按摩你的例子,以得到上个月最后一周的第一个星期六和星期五。(我们总是在区域中计算一个月的账单。)我想选择两个答案作为接受答案,因为我确实有两个问题,并使用您的示例代码来解决每个问题。