PL/SQL Challenge 每日一题:2018-12-20 INTERVAL字面量

[复制链接]
查看11 | 回复3 | 2008-9-15 01:28:12 | 显示全部楼层 |阅读模式
最先答对且答案未经编辑的puber将获得纪念章一枚(答案不可编辑但可发新贴补充或纠正),其他会员如果提供有价值的分析、讨论也可获得纪念章一枚。
每两周的优胜者可获得itpub奖励的技术图书一本。
以往旧题索引:
http://www.itpub.net/forum.php?m ... eid&typeid=1808
原始出处:
http://www.plsqlchallenge.com/
作者: Kim Berg Hansen
运行环境:SQLPLUS, SERVEROUTPUT已打开
注:本题给出答案时候要求给予简要说明才能得到奖品
我有一张表,带有一个时间戳的列:
create table qz_someday (
sometimetimestamp(9)
)
/
insert into qz_someday values (
to_timestamp('2018-12-25 12:34:56', 'YYYY-MM-DD HH24:MI:SS')
)
/
commit
/
我想要在时间戳上面加上0.123456789秒,然后显示这个结果,包括所有完整的小数点并不进行任何四舍五入。为此我写了这个未完成的查询:
select to_char(

##REPLACE##
, 'YYYY-MM-DD HH24:MI:SS.FF9'
) as the_time
from qz_someday
/
哪些选项可以取代##REPLACE##使得查询返回这个输出:
THE_TIME
-----------------------------
2018-12-25 12:34:56.123456789

(A)
sometime + interval '0.123456789' second
(B)
sometime + interval '0.123456789' second(9)
(C)
sometime + interval '0.123456789' second(1, 9)
(D)
sometime + interval '00:00.123456789' minute to second
(E)
sometime + interval '00:00.123456789' minute to second(9)
(F)
sometime + interval '00:00.123456789' minute to second(2, 9)
(G)
sometime + numtodsinterval(0.123456789, 'second')
(H)
sometime + numtodsinterval(0.123456789, 'second(9)')
(I)
sometime + cast(

numtodsinterval(0.123456789, 'second')

as interval day to second

)


(J)
sometime + cast(

numtodsinterval(0.123456789, 'second')

as interval day to second(9)

)


(K)
sometime + cast(

numtodsinterval(0.123456789, 'second')

as interval day to second(1, 9)

)
(L)
sometime + (to_timestamp('00.123456789', 'SS.FF9')

- to_timestamp('00.000000000', 'SS.FF9')
)
(M)
sometime + (to_timestamp('00.123456789', 'SS.FF9')

- to_timestamp('00.000000000', 'SS.FF9')
) day to second(9)
(N)
sometime + (to_timestamp('00.123456789', 'SS.FF9')

- to_timestamp('00.000000000', 'SS.FF9')
) day to second(2, 9)


回复

使用道具 举报

千问 | 2008-9-15 01:28:12 | 显示全部楼层
cegjlm
回复

使用道具 举报

千问 | 2008-9-15 01:28:12 | 显示全部楼层
请楼上给出答案的简要说明。
回复

使用道具 举报

千问 | 2008-9-15 01:28:12 | 显示全部楼层
答案CEGJLM, 本期无人得奖。
A: 不指定秒数精度的interval字面量确实为小数点后面6位,所以我得到这个错误的结果:
THE_TIME
-----------------------------
2018-12-25 12:34:56.123457000
B: 此处我指定的是秒的位数,而不是小数点之后的位数,所以小数点之后仍然为缺省的6位,得到和A选项一样的错误结果。
C: 指定1位秒数和小数点之后9位是可行的,所以我得到了想要的精度和预期的结果。
D: 如果interval字面量不只包含秒,而且还有例子中的分钟,我就需要指定最高和最低的单位,此处就是minute to second。但是我还是没有指定精度,所以缺省为6位,得到了和A一样的错误结果。
E: 当我像选项ABC那样单独使用秒,我可以在秒数使用很多位,例如百万秒。但是如果像这里一样使用minute to second,按定义,秒数只能够在0 和 59.999999999之间。于是再指定秒数就没有意义,所以此处的精度参数指定的是小数点之后的秒数(这和B不同)。所以即使这个选项看起来和B一样错误,实际上它却是正确的。
F: 正如前一选项所看到的,当秒被用在分钟(或者小时或者天)之后,那么能够指定的精度就是小数点之后的秒数。所以选项C是对的,而这个选项会报错:
ORA-00907: missing right parenthesis.
假如要这么用,我就需要像E选项那样做。
G: 当我用NUMTODSINTERVAL而不是interval字面量,缺省小数点之后的精度是9而不是6。所以这是可行的。
H: 实际上你无法为NUMTODSINTERVAL指定精度,这个选项会报错:
ORA-01760: illegal argument for function.
I: 但是当我把interval用CAST转换为INTERVAL DAY TO SECOND, 数据类型的小数点精度再次缺省为6,而我再次得到和A一样的错误结果。
J: 为了修复前一选项,我需要指定小数点之后的精度。当我为此数据类型指定了小数点之后精度,它就和E选项的语法一样,都是可行的。
K: 正如F选项会报错,这个也会报错:
ORA-00907: missing right parenthesis.
这是因为像选项C那样同时指定小数点之前和之后的位数仅仅是当interval只包含秒的时候被支持。
L: 把一个timestamp减去另外一个timestamp就返回了interval, 缺省是小数点之后9位,这使得这个选项正常工作。
M: 一个interval表达式包含一对括号,里面是一个date 或 timestamp减去另外一个一个date 或 timestamp,然后在括号之后紧跟着数据类型的说明。因为两个timestamp相减会得到一个interval,这和前一选项没有区别。但是使用这个方法,你可以强制一个date减去另外一个date返回interval而不是一个number
N: 这个语法和数据类型说明一样,不支持同时指定两种精度,仅仅支持小数点之后的精度。这个选项会报错:
ORA-00907: missing right parenthesis.
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行