水晶报告 - 如何从字符串中提取日期

时间:2012-08-01 11:29:42

标签: crystal-reports

使用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

2 个答案:

答案 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等的特殊字符将多行字符串转换为长字符串。用空格或其他无害字符替换它们,然后处理结果字符串就好像它只是一个常规字符串(日期在中间)。

你仍然需要做一些假设才能做到这一点:每个字符串一个日期,所有特殊字符都是已知的(或者你必须测试所有可能的特殊字符),日期符合格式,等等。