使用Crystal Reports 2008,我需要从文本字段中提取日期。此日期通常采用dd / mm / yy格式,但也可以输入为d / m / yy,dd / m / yyyy等。
此日期可能出现在字符串中的任何位置。
目前我依赖于这样一个事实,即日期位于字符串的末尾,没有跟随的完整停止,并使用LEFT / RIGHT来提取每个日期部分。然后将这些部分传递给另一个公式以创建完整日期:
将AllocationDate()调暗为日期 如果不是(IsNull({Command.Notes}))那么 Formula = DateValue((ToNumber({@Year})),(ToNumber({@Month})),(ToNumber({@Day})))
但是,如果有人使用格式的变体,请在整个报告确定的日期之后添加一个或多个笔记。
有什么方法可以通过寻找模式来提取这个日期吗?我猜我可以使用TRIM来解决格式上的不一致问题。
tyvmia
答案 0 :(得分:1)
您可能需要考虑使用regular expression。
Crystal Reports没有正则表达式的原生支持,因此您需要添加UFL:crystal reports : is there a way to regex in crystal reports?
您应该能够根据自己的需要调整此问题中的模式:Javascript date regex DD/MM/YYYY
最后,您可以使用regexpal.com在文本上测试模式。
**编辑**
创建一个SQL表达式字段(Oracle 10语法)以提取日期字符串并将其转换为日期字段:
// {%Allocation Date}
(
-- match date-like string, then convert to date type; is no dates are found, NULL is returned
TO_DATE( REGEXP_SUBSTR( TABLE.FIELD, '\d{1,2}\/\d{1,2}\/\d{2,4}',1 ,1), 'dd/mm/yyyy')
)
虽然你可以
答案 1 :(得分:0)
并且,作为最后的手段,您可以尝试通过替换表示CR,LF等的特殊字符将多行字符串转换为长字符串。用空格或其他无害字符替换它们,然后处理结果字符串就好像它只是一个常规字符串(日期在中间)。
你仍然需要做一些假设才能做到这一点:每个字符串一个日期,所有特殊字符都是已知的(或者你必须测试所有可能的特殊字符),日期符合格式,等等。