获得月的第一个星期六和月的最后一个星期五

时间:2012-12-21 18:01:09

标签: datetime reporting-services report-designer

这个需求有点奇怪,我可以在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等处理条件语句,但没有好运。有人做过这样的事吗?

3 个答案:

答案 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. 本月第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())
        )
    
  4. 甚至可能有更聪明的方法来做到这一点,尽管VBScript表达式 有点受限。可以调整上面的示例以获得“本月最后一周的星期五”。

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

答案 2 :(得分:-1)

获取上个月的上个星期五.....

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