2012-12-21 199 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))

相關問題