在我的数据库中,我有一个类型为varchar(8)的日期字段,我用它来存储格式为YYYYMMDD的日期值。我无法创建一个简单的CR公式来显示以下格式的日期范围:
2012年10月1日至2012年10月31日
这是我当前且非常不吸引人的CR公式:
stringvar yYear;
stringvar mMonth;
datevar OrigDate;
numbervar StartDay;
stringvar EndDay;
yYear := Mid ({Command.Date}, 1, 4);
select Mid ({Command.Date}, 5, 2)
case "01": mMonth:= "January"
case "02": mMonth:= "Februry"
case "03": mMonth:= "March"
case "04": mMonth:= "April"
case "05": mMonth:= "May"
case "06": mMonth:= "June"
case "07": mMonth:= "July"
case "08": mMonth:= "August"
case "09": mMonth:= "September"
case "10": mMonth:= "October"
case "11": mMonth:= "November"
case "12": mMonth:= "December";
OrigDate := CDate(ToNumber({Command.Date}[1 to 4]), ToNumber({Command.Date}[5 to 6]), ToNumber({Command.Date}[7 to 8]));
StartDay := ToNumber({Command.Date}[7 to 8]);
EndDay := Mid(ToText(DateSerial(Year(OrigDate), Month(OrigDate) +1, 1-1)), 4, 2);
mMonth + " " + ToText(StartDay, "#") + ", " + yYear + " to " + mMonth + " " + EndDay + ", " + yYear
这是有效的,但本着可维护性和良好/干净的编码实践的精神,我想尽可能简化这个功能。
我在Crystal中编写报告比较新,所以我希望我没有“重新发明轮子”。
答案 0 :(得分:0)
试试这个:
local numbervar year := tonumber(left({Command.Date},4));
local numbervar month:= tonumber(mid({Command.Date},5,2));
local numbervar day := tonumber(right({Command.Date},2));
local datevar stDate := date(year,month,day);
local datevar endDate := dateserial(year,month+1,day-1); //get last day of month
totext(stDate,"MMMM d, yyyy") + " to " + totext(endDate,"MMMM d, yyyy")
答案 1 :(得分:0)
DRYer解决方案?
创建自定义函数:
// YYYYMMDD()
// Convert a value in 'YYYYMMDD' to a Date
Function (Stringvar value)
Date( ToNumber(value[1 to 4]), ToNumber(value[5 to 6]), ToNumber(value[7 to 8]) )
为开始日期创建公式:
//{@Starting Date}
YYYYMMDD( {Command.Date} )
为结束日期创建公式:
//{@Ending Date}
// find first day of current month, add a month, subtract a day, truncate time
Date( DateAdd("m", 1, Date( Year({@Starting Date}), Month({@Starting Date}), 1) ) - 1 )
将两个公式字段嵌入文本字段中,并根据需要格式化每个字段(增加灵活性)。