2014-09-20 83 views
-3

我想從給定日期開始獲得一週中的6天,但if子句沒有采用「星期日」。檢查一個日期是否爲星期日

V DATE :=TO_DATE (&H, 'DDMMYYYY'); 
V1 DATE:=V+6; 
V2 VARCHAR(10); 
BEGIN 
    WHILE V<V1 LOOP 
    V2:=TO_CHAR(V,'DAY'); 

    IF V2='SUNDAY' THEN 
     DBMS_OUTPUT.PUT_LINE('TODAY IS SUNDAY');-- IF IS NOT TAKING THE VALUE 
    END IF; 

    DBMS_OUTPUT.PUT_LINE(V2||V); 

    V:=V+1; 
    END LOOP; 
END; 

輸出:

FRIDAY 19-SEP-14 
SATURDAY 20-SEP-14 
SUNDAY 21-SEP-14 
MONDAY 22-SEP-14 
TUESDAY 23-SEP-14 
WEDNESDAY24-SEP-14 
+0

但你爲什麼喊? – Mureinik 2014-09-20 08:31:10

+0

雅儀式,對不起瓶蓋被打開..再次抱歉 – user2686661 2014-09-20 08:36:48

+2

所以你住在一個全大寫的國家? – GolezTrol 2014-09-20 08:38:17

回答

2

的問題是,TO_CHAR(V,'DAY')天之後添加空格,因爲它墊白天最長的一天名稱。您也可以在輸出中看到這一點,其中所有日期都完美對齊。

解決辦法:Trim值:

IF TRIM(V2) = 'SUNDAY' THEN 

這個問題還描述:http://www.orafaq.com/forum/t/45942/0/

另外一個不錯的解決方案是使用numeric date language作爲NLS設置,以獲得天數:

V3 := TO_CHAR(V, 'DAY', 'NLS_DATE_LANGUAGE=''numeric date language'''); 

這樣,TO_CHAR函數將返回從一個數字(如字符串) '1'(星期一)到 '7'(星期日),WHI ch不是本地化的,並且當週日可能是第一天時不受地區設置的影響。

numeric date language是一種特殊的「語言」,其中一天的名字是數字。因爲它實際上是一個日期名稱,所以您需要使用'DAY'而不是'D',並且出於同樣的原因,它不受本地區的影響。這是一個隱藏的功能,我認爲它用於測試數據功能的本地化功能。好處是它不依賴於已安裝的語言,但我猜英語也會一直可用。

+0

謝謝Golez :) – user2686661 2014-09-20 08:55:48

+1

最好使用「DY''格式,它只能給出日期的3個字母。沒有額外空間填充在右邊的問題。 – 2014-09-20 08:59:59

+0

@LalitKumarB但是這會搞亂輸出。儘管如此,一個很好的補充謝謝。或者,您可以使用「數字日期語言」來將日期作爲數字。我決定補充說,因爲Alex Poole已經寫了一個關於'DY'的詳細答案。 – GolezTrol 2014-09-20 10:42:46

1

作爲替代TRIM()或使用縮寫形式與DY格式元素,你也可以使用the FM fill-mode format modifier來獲得完整的日期名不填充:

V2:=TO_CHAR(V,'FMDAY'); 

IF V2='SUNDAY' THEN 
... 

當然,這並不搞亂你顯示既然你那麼使用相同的V2值,所以你會看到:

FRIDAY19-SEP-14 
SATURDAY20-SEP-14 
TODAY IS SUNDAY 
SUNDAY21-SEP-14 
MONDAY22-SEP-14 
TUESDAY23-SEP-14 
WEDNESDAY24-SEP-14 

兩個DAYDY由你ñ影響LS設置,所以如果誰運行這個恰好是在不同的語言環境,這可能無法按預期工作;例如,對於講法語的國家/地區的某個人,將會看到DIMANCHE,這不等於字符串字面值'SUNDAY'。您可以通過指定的語言要使用去除可能的二義:

V2:=TO_CHAR(V,'FMDAY','NLS_DATE_LANGUAGE=ENGLISH'); 

這似乎有點小題大做,但如果你比較的結果,而不是僅僅顯示它,這是一個更加安全。既然你要顯示也可以通過執行TO_CHAR()兩次獲得兩個:

alter session set NLS_DATE_LANGUAGE=SPANISH; 
DECLARE 
V DATE :=TO_DATE (&H, 'DDMMYYYY'); 
V1 DATE:=V+6; 
BEGIN 
    WHILE V<V1 LOOP 
    IF TO_CHAR(V,'FMDAY','NLS_DATE_LANGUAGE=ENGLISH')='SUNDAY' THEN 
     DBMS_OUTPUT.PUT_LINE('TODAY IS SUNDAY'); 
    END IF; 

    DBMS_OUTPUT.PUT_LINE(TO_CHAR(V,'DAY')||V); 

    V:=V+1; 
    END LOOP; 
END; 
/

VIERNES 19-SEP-14 
SÁBADO 20-SEP-14 
TODAY IS SUNDAY 
DOMINGO 21-SEP-14 
LUNES 22-SEP-14 
MARTES 23-SEP-14 
MIÉRCOLES24-SEP-14 

的比較總是在固定的語言,但顯示將在會話語言。

您也可以輕易地同時顯示週日日期和爲此在普通的SQL,除了「今天是星期天」的消息;或者使用更簡單的PL/SQL循環。取決於你的實際使用情況。

+0

+1好的選擇。不知道填充模式。 – GolezTrol 2014-09-20 10:40:44

相關問題