似乎有不被任何好處分裂出來的時候,這裏的日期。它似乎有責任將這兩個字都存儲在字符列中,這是一個典型的錯誤 - 通常以災難結束。 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()
來完成此操作。
雖然我強烈建議您將所有內容都轉換爲日期。
你有兩個'date'參數'dog_date'和'ard_date'?更多參數?什麼數據類型? –
dog_date來源於存儲爲dd/mm/yyyy的表格,ard_date是一個常量,爲08:00。 – user2151312
「日期」沒有格式。如果一個變量有一個格式,這意味着你有一個'varchar2'試圖表示一個日期。你說'ard_date'是一個常量?那麼你爲什麼要計算它呢? –