Crystal Reports中的NEXT_DAY

时间:2014-04-07 20:36:54

标签: oracle datetime crystal-reports formula

Crystal Reports使用的语法中是否有类似Oracle“NEXT_DAY”的功能?

我正在尝试编写一个公式,如果测试的日期时间介于星期五晚上9:00到星期一@9:00之间,则输出以下星期一上午9:00。

到目前为止我已经

IF DAYOFWEEK ({DATETIMEFROMMYDB}) IN [7,1]
    OR (DAYOFWEEK({DATETIMEFROMMYDB}) = 6 AND TIME({DATETIMEFROMMYDB}) in time(21,00,00) to time(23,59,59))
    OR (DAYOFWEEK({DATETIMEFROMMYDB}) = 2 AND TIME({DATETIMEFROMMYDB}) in time(00,00,00) to time(08,59,59))
THEN ...

我知道我可以编写单独的IF语句,为每个星期五,星期六,星期一,星期一做一个不同数量的DateAdd,但是如果我可以通过将所有这些混合成一个来保持简洁,我会更喜欢它。如果日期时间在其他工作日的营业时间之外,我已经要添加额外的规则,所以我想尽可能地做,以防止这成为一个非常杂乱和丑陋的公式。

2 个答案:

答案 0 :(得分:0)

由于没有我所知道的CR等价物,你可以欺骗并借用Oracle数据库中的NEXT_DAY()函数。您可以通过创建SQL表达式然后输入以下内容来执行此操作:

-- SQL Expression {%NextDay}
(SELECT NEXT_DAY("MYTABLE"."MYDATETIME", 'MONDAY')
 FROM DUAL)

然后您可以直接在公式中使用它:

IF DAYOFWEEK ({MYTABLE.MYDATETIME}) IN [7,1]
    OR (DAYOFWEEK({MYTABLE.MYDATETIME}) = 6 AND TIME({MYTABLE.MYDATETIME}) in time(21,00,00) to time(23,59,59))
    OR (DAYOFWEEK({MYTABLE.MYDATETIME}) = 2 AND TIME({MYTABLE.MYDATETIME) in time(00,00,00) to time(08,59,59))
THEN DateTime(date({%NextDay}),time(09,00,00))

或者,甚至更好的方式是将所有逻辑填充到SQL表达式中并完全取消公式。

答案 1 :(得分:-1)

EvaluateAfter({DATETIMEFROMMYDB}) ;
If DayOfWeek ({DATETIMEFROMMYDB}) In [crFriday,crSaturday,crSunday,crMonday]
then
IF DayOfWeek ({DATETIMEFROMMYDB}) In [crFriday] 
AND TIME({DATETIMEFROMMYDB}) >= time(21,00,00)
then //your code here
Else if Not(DayOfWeek ({DATETIMEFROMMYDB}) In [crFriday] )
AND (TIME({DATETIMEFROMMYDB}) >= time(00,00,00) AND TIME({DATETIMEFROMMYDB}) <= time(23,59,59))
then //your code here
Else if DayOfWeek ({DATETIMEFROMMYDB})In [crMonday] 
AND TIME({DATETIMEFROMMYDB}) < time(09,00,00)
then //your code here