2012-12-21 225 views
2

的最后一个星期五这需要的是一个有些奇怪,我能做到这一点在C#中,但似乎无法得到的报表设计器的表达式语法正确。获取月份的第一个星期六和上周月

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

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

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

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

我已经和条件语句中使用一个月()工作,平日(),WEEKDAYNAME等,但没有好运气。有没有人做过这样的事情?

+0

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

回答

1

你可能不需要任何沉重的条件语句。如果你这样做,模拟循环和其他必要的编程功能,可能更容易在Custom Code创建一个函数来做到这一点。

的alterantive是看为你做具体的计算的算法。例如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. 所以日期为第一星期六当月urday是:

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

可能有更聪明的方法来做到这一点,虽然VBScript的表达式一丁点儿有限。上面的例子可以调整以获得“本月最后一周的星期五”。

底线:在(间接,但通用)回答你的问题就是思考算法到你想要的日期(声明性越好,因为你不能做在表达式中环路和东西容易)。

+1

Jeroen,谢谢你有条不紊地走过。它有助于了解你如何通过它来推理。我可以使用相同的方法来获得结束日期。 – DJGray

+0

我不是SQL以外的编码器。我不知道FirstDayOfWeek命令。感谢你的回答。 – Neil

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' 
+1

Neil,谢谢你的回复。我已经完成嵌套的IIF,但从来没有那么多! ;-) – DJGray

+0

感谢你(尼尔和杰罗恩)。我设法按摩你的例子,得到前一个月最后一周的第一个星期六和星期五。 (我们总是在计算器中记帐一个月)。我想选择两个答案作为接受的答案,因为我真的有两个问题,并使用您的示例代码来解决每个问题。 – DJGray

-1

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

=使用DateAdd(DateInterval.Day, - 平日(DATEADD( “d”,1 - 现在()天,现在()) ,FirstDayOfWeek.Saturday),DateSerial(Year(Date.Now),Month(Date.Now),1))

相关问题