一、原题
二、题目翻译
三、题目解析
四、测试
B选项测试结果:
C选项测试结果:
SQL> select nvl(months_between(sysdate,to_date('2014-1-2','yyyy-mm-dd')),'Ongoing') from dual;
select nvl(months_between(sysdate,to_date('2014-1-2','yyyy-mm-dd')),'Ongoing') from dual
*
ERROR at line 1:
ORA-01722: invalid number
NVL函数的详细用法,参考:
http://blog.csdn.net/holly2008/article/details/25251513
MONTH_BETWEETN的用法详见:
http://blog.csdn.net/holly2008/article/details/23141827
Examine the structure of the PROGRAMS table:
Name Null Type
PROG_ID NOT NULL NUMBER(3)
PROG_COST NUMBER(8,2)
START_DATE NOT NULL DATE
END_DATE DATE
Which two SQL statements would execute successfully? (Choose two.)
A. SELECT NVL(ADD_MONTHS(END_DATE,1),SYSDATE)
FROM programs;
B. SELECT TO_DATE(NVL(SYSDATE-END_DATE,SYSDATE))
FROM programs;
C. SELECT NVL(MONTHS_BETWEEN(start_date,end_date),'Ongoing')
FROM programs;
D. SELECT NVL(TO_CHAR(MONTHS_BETWEEN(start_date,end_date)),'Ongoing')
FROM programs;
答案:AD
Name Null Type
PROG_ID NOT NULL NUMBER(3)
PROG_COST NUMBER(8,2)
START_DATE NOT NULL DATE
END_DATE DATE
Which two SQL statements would execute successfully? (Choose two.)
A. SELECT NVL(ADD_MONTHS(END_DATE,1),SYSDATE)
FROM programs;
B. SELECT TO_DATE(NVL(SYSDATE-END_DATE,SYSDATE))
FROM programs;
C. SELECT NVL(MONTHS_BETWEEN(start_date,end_date),'Ongoing')
FROM programs;
D. SELECT NVL(TO_CHAR(MONTHS_BETWEEN(start_date,end_date)),'Ongoing')
FROM programs;
答案:AD
二、题目翻译
查看PROGRAMS表的结构
哪两个SQL语句执行成功?(选择两个)
哪两个SQL语句执行成功?(选择两个)
三、题目解析
A选项正确,ADD_MONTHS返回date类型,第二参数sysdate也是date类型,NVL两个参数类型一致。
B选项不正确,SYSDATE-END_DATE结果是一个number类型,nvl的第二个参数是date类型,会隐式转换为number类型,to_date参数是number类型,会报错。
C选项不正确,MONTHS_BETWEEN返回一个number类型,nvl第一个参数number类型,第二个参数字符串类型,无法隐式转换,报错。
D选项正确,MONTHS_BETWEEN返回的是number类型,to_char转成了字符类型,这样nvl的两个参数类型一致。
Months_between函数:返回一个number类型,如果第一个参数的日期大于第二个参数参数的日期,则返回正数,否则返回负数。
B选项不正确,SYSDATE-END_DATE结果是一个number类型,nvl的第二个参数是date类型,会隐式转换为number类型,to_date参数是number类型,会报错。
C选项不正确,MONTHS_BETWEEN返回一个number类型,nvl第一个参数number类型,第二个参数字符串类型,无法隐式转换,报错。
D选项正确,MONTHS_BETWEEN返回的是number类型,to_char转成了字符类型,这样nvl的两个参数类型一致。
Months_between函数:返回一个number类型,如果第一个参数的日期大于第二个参数参数的日期,则返回正数,否则返回负数。
四、测试
B选项测试结果:
SQL> select sysdate-to_date('2014-1-2','yyyy-mm-dd') from dual;
SYSDATE-TO_DATE('2014-1-2','YYYY-MM-DD')
----------------------------------------
126.466042
SQL> select nvl(sysdate-to_date('2014-1-2','yyyy-mm-dd'),sysdate) from dual;
NVL(SYSDATE-TO_DATE('2014-1-2','YYYY-MM-DD'),SYSDATE)
-----------------------------------------------------
126.46706
SQL> select to_date(126.3) from dual;
select to_date(126.3) from dual
*
ERROR at line 1:
ORA-01861: literal does not match format string
SYSDATE-TO_DATE('2014-1-2','YYYY-MM-DD')
----------------------------------------
126.466042
SQL> select nvl(sysdate-to_date('2014-1-2','yyyy-mm-dd'),sysdate) from dual;
NVL(SYSDATE-TO_DATE('2014-1-2','YYYY-MM-DD'),SYSDATE)
-----------------------------------------------------
126.46706
SQL> select to_date(126.3) from dual;
select to_date(126.3) from dual
*
ERROR at line 1:
ORA-01861: literal does not match format string
C选项测试结果:
SQL> select nvl(months_between(sysdate,to_date('2014-1-2','yyyy-mm-dd')),'Ongoing') from dual;
select nvl(months_between(sysdate,to_date('2014-1-2','yyyy-mm-dd')),'Ongoing') from dual
*
ERROR at line 1:
ORA-01722: invalid number
NVL函数的详细用法,参考:
http://blog.csdn.net/holly2008/article/details/25251513
MONTH_BETWEETN的用法详见:
http://blog.csdn.net/holly2008/article/details/23141827