2013-11-23 39 views
0

我有以下邏輯來分別比較日期和時間。Oracle 9.2分別比較日期和時間的步驟

If current_date = DOG_Date and current time is less than 11.59pm 
    Set ARD date to current date + 1 
    Set ARD time to 08:00am 
End if; 

If current date greater than DOG Date and current time is less than 07.00am 
    Set ARD date to next Day (Can be same day) 
    Set ARD time to 08:00am 
End if; 

的ARD格式應爲DD.MM.YYYY 的ARD時間應24hh.mi

能否請你幫我PLSQL實現的呢?我試過並能夠成功驗證日期部分,但是發現時間部分存在問題。

由於提前, 問候

+0

你有兩個'date'參數'dog_date'和'ard_date'?更多參數?什麼數據類型? –

+0

dog_date來源於存儲爲dd/mm/yyyy的表格,ard_date是一個常量,爲08:00。 – user2151312

+0

「日期」沒有格式。如果一個變量有一個格式,這意味着你有一個'varchar2'試圖表示一個日期。你說'ard_date'是一個常量?那麼你爲什麼要計算它呢? –

回答

0
DECLARE 
    dog_date DATE := to_date('20/11/2013','dd/mm/yyyy'); 
    ard_date DATE; 
BEGIN 
    IF TRUNC(CURRENT_DATE) = TRUNC(dog_date) AND CURRENT_DATE < TRUNC(CURRENT_DATE) + 1 THEN 
      ard_date := TRUNC(CURRENT_DATE) + 8/24 +1; 
    END IF; 

    IF TRUNC(CURRENT_DATE) > TRUNC(dog_date) AND CURRENT_DATE < TRUNC(CURRENT_DATE) + 7/24 THEN 
      ard_date := TRUNC(CURRENT_DATE) + 8/24 +1; --as your need 
    END IF; 
END; 
+0

謝謝,你能解釋一下邏輯和計算<11點59分和<7點 – user2151312

1

似乎有不被任何好處分裂出來的時候,這裏的日期。它似乎有責任將這兩個字都存儲在字符列中,這是一個典型的錯誤 - 通常以災難結束。 Oracle的「日期」數據類型是日期時間;值得使用它。

假設你所有的日期和時間都是實際的日期,你可以大大簡化你的邏輯。首先「ARD時間」是早上8點,如果你的任何條件是真的。我懷疑你在下午11點59分的情況也是一個錯誤。如果你的意思是不到午夜時間,那麼這種情況總是如此,可以放棄。這反過來使你的第一個條件的邏輯。

If the current date is equal to the DOG date then 
    ARD date is 8am tomorrow 

這可以在PL/SQL被表示爲:

if trunc(sysdate) = trunc(dog_date) then 
    ard_date := trunc(sysdate) + interval '32' hour; 
end if; 

TRUNC(date)刪除由默認的日期的時間部分。我知道你會說,你想分開的日期和時間,你可以使用TO_CHAR()以任何你想要的方式將這個日期轉換回字符。 Oracle包含datetime format models時間:

ard_date_char := to_char(ard_date, 'dd.mm.yyyy'); 
ard_time_char := to_char(ard_date, 'hh24:mi'); 

「相同」的一天在第二份聲明中提及不是直觀陌生人正如您所料。我認爲這意味着你的「日」始於早上7點。

要在這裏逐位把你的邏輯:

If current date greater than DOG Date 

可以表示爲:

if trunc(sysdate) > trunc(dog_date) 

和你的第二個條件:

and current time is less than 07.00am 

是一個比較在當前日期與任意時間的時間。爲了進行這種比較,您可以使用TRUNC()從當前日期中刪除時間部分,然後再添加7個小時。通過比較這與當前的系統日期,你會得到你的答案。

and sysdate < trunc(sysdate) + interval '7' hour 

現在很難位

Set ARD date to next Day (Can be same day) 

假設(再一次),你的「天」開始於早上7點這裏所需要的增量可以從1分鐘什麼24小時。但是,您已經知道您當前的時間是在上午7點之前,這意味着您在「下一個」日期的時間裏不會有。然後,您可以始終假定它是當天。這使得完整的邏輯:

if trunc(sysdate) > trunc(dog_date) 
    and sysdate < trunc(sysdate) + interval '7' hour 
     ard_date := trunc(sysdate) + interval '8' hour; 
end if; 

如果你的第一個IF語句真正需要的下午11時59分,你可以在第二個語句中使用相同的邏輯來進行比較,即trunc(sysdate) + 1 - interval '1' minute

雖然您沒有提供任何代碼,但我懷疑您獲取這些日期的方式並不排除在創建日期變量本身時幾乎所有這些邏輯的放置。考慮你是否真的需要做這些事情,例如,選擇日期(如果這確實是你正在做的事)的CASE語句就足夠了。

現在,這一切都假設您已經使用了日期來存儲日期。這聽起來不像你有,所以你可能必須先將所有東西都轉換成日期,然後再從日期中轉換回來。您使用TO_DATE()TO_CHAR()來完成此操作。

雖然我強烈建議您將所有內容都轉換爲日期。