2014-04-22 48 views
8

如何获取水晶报表公式字段中的7天或每周取决于日期范围?如何获取水晶报表中日期范围的每周或7天

Example: 
    Date Range from March 01, 2014 to March 31, 2014 

Output: 
    Week 1 (March 01 to March 07) 
    Week 2 (March 08 to March 14) 
    Week 3 (March 15 to March 21) 
    Week 4 (March 22 to March 28)   
    Week 5 (March 29 to March 31) 
+0

但如果你看到游行的压延第一个星期是唯一的'第一march'的assmuming周的第一天是'sunday'以同样的方式第二周是'02 - 三月08 - March' ..你确定这是否符合你的要求? – Siva

+0

不,这不是特定的月份,例如我会尝试从3月1日到4月15日选择,因此它会自动获得7天,直到达到时间范围的最后一天为止。 – Captain16

+0

确定在这种情况下第5周应该是从“3月29日到4月4日”? – Siva

回答

0

自定义功能RangeWeekSplitter在一年内工作。水晶语法。

Function (dateTimeVar dFrom, dateTimeVar dTo) 

// First day of the year 
local dateTimeVar dBegCurrYear:= Date (Year(dFrom), 1, 1); 

// Day of year (1 to 365 or 366 in a leap year) 
local numberVar nFrom:= DatePart ("y", dFrom); 
local numberVar nTo:= DatePart ("y", dTo); 

local numberVar i; 
local numberVar iTo; 
local numberVar nDaysInWeek:= 7; // number of days in the week 
local numberVar nWeek:= 0; // counter weeks 
local stringVar sResult:= ""; // output string 

for i:= nFrom to nTo step nDaysInWeek do 
(
    nWeek:= nWeek+1; 
    iTo:= i+(nDaysInWeek-1); 

    if(i+nDaysInWeek > nTo) 
     then iTo:= nTo; 

    // generate output string 
    sResult:= sResult + chr(13)+ 
     "Week " + CStr(nWeek) + " (" + 
      CStr(DateAdd ("y", i-1, dBegCurrYear), "MMMM d") + 
       " to " + 
      CStr(DateAdd ("y", iTo-1, dBegCurrYear), "MMMM d") + 
     ")"; 
); 

sResult; 

用例:

// Date range 
local dateTimeVar dFrom:= Date (2016, 1, 14); 
local dateTimeVar dTo:= Date (2016, 3, 4); 

RangeWeekSplitter (dFrom, dTo); 
0

您可以使用DatePart"ww"了。见IBM Knowledge Center

DATEPART(intervalType,inputDateTime)

...

WW:一年(1周以53 Firstdayofweek可与firstWeekOfYear确定的第一个日历周的确切天年)

结合DatePart ("w", inputDateTime)DayOfWeek(inputDateTime)获取星期几,您可以计算当前日历星期的第一天和最后一天。

因此,对于一个特定日期(inputDateTime),这将是您的公式“RangeWeek”:

Function (DateTimeVar inputDateTime) 
NumberVar cw := DatePart("ww", inputDateTime); 
DateTimeVar first := DateAdd("d", 1 - DayOfWeek(inputDateTime, crMonday), inputDateTime); 
DateTimeVar last := DateAdd("d", 7 - DayOfWeek(inputDateTime, crMonday), inputDateTime); 

"Week " + ToText(cw) + " (" + ToText(first) + " to " + ToText(last) + ")" 

你需要给ToText你想要的格式字符串,当然。

例子:

Input: "August 23, 2017" 
Output: "Week 34 (August 21 to August 27)" 

这使得事情你在哪里得到的日期范围在公式中更容易。

DateTimeVar from := ...; 
DateTimeVar to := ...; 
NumberVar cw; 
NumberVar count := 0; 
StringVar output := ""; 
for cw := DatePart("ww", from) to DatePart("ww", to) do 
(
    output := output + chr(13) + RangeWeek(DateAdd("d", 7*count, from)); 
    count := count + 1; 
); 

output 
相关问题