2014-04-07 184 views
2

有沒有像Crystal Reports使用的語法中提供的Oracle「NEXT_DAY」函數?Crystal Reports中的NEXT_DAY

如果測試的日期時間介於星期五@晚上9點到週一@上午9點之間,我正在嘗試編寫一個公式以輸出以下星期一@上午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的,但如果我可以把它簡潔的結塊所有這些我都會更喜歡它。如果日期時間在其他工作日的工作時間之外,我已經打算增加額外的規則,所以我想盡可能地做到這一點,以防止這種情況變成一種非常雜亂和醜陋的公式。

回答

0

由於沒有我知道的CR等價物,因此您可以從Oracle數據庫中作弊並借用NEXT_DAY()函數。

-- 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表達式,然後進入像這樣做只是將所有的邏輯填充到SQL表達式中,並完全消除公式。

+0

今天真的很忙其他項目,但我明天會試用這個。謝謝! – CactusCake

-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 
+0

我認爲「如果不是星期五」和「如果星期一」條款需要顛倒。否則,例如在星期一中午12點加蓋的記錄將在本聲明的中間通過匹配「不是星期五以及00:00和23:59之間」過濾器來獲取。 – CactusCake

+0

如果你認爲職位是有幫助的... ...扭轉條款,並嘗試 – Siva

+0

@Downvoter ...評論什麼是錯誤的公式它是一個測試的,併爲我工作... – Siva