2014-09-20 82 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

相关问题