Crystal Reports使用的语法中是否有类似Oracle "NEXT_DAY"函数的东西?
如果测试的日期时间介于星期五@ 9:00pm和星期一@ 9:00am之间,我正在尝试编写一个公式以输出下一个星期一@ 9:00am。
到目前为止,我有
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,但如果我可以通过将所有这些归为一个来保持简洁,我会更喜欢它。我已经要添加额外的规则,如果日期时间在其他工作日的营业时间之外,所以我想尽可能多地防止它成为一个非常杂草丛生和丑陋的公式。
由于我知道没有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
-
前 7 个是我们想要支持的一周
7 = 1 周14 = 2 周
-
最后一个数字 (1) 是 1 表示星期日,2 表示星期一,3 表示星期二
上周日 1周前今天 - 7 + ( 7 - 平日(今天) )+1
上周一 2周前今天 - 14 + ( 7 - 平日(今天) )+2
所以这两个公式给了我上周星期一和上周星期天。
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