trunc的问题
遇到一个很奇怪的问题
select trunc( (to_date('2003-06-02 00:05:00', 'yyyy-mm-dd hh24:mi:ss')-
trunc(sysdate, 'dd'))*288 )
from dual
/
返回0
但是
select (to_date('2003-06-02 00:05:00', 'yyyy-mm-dd hh24:mi:ss')-
trunc(sysdate, 'dd'))*288
from dual
/
返回1
什么道理
谢谢大家
问题点数:0、回复次数:9Top
1 楼Lastdrop(空杯)回复于 2003-06-02 12:59:15 得分 0
是因为
SQL> select (to_date('2003-06-02 00:05:00', 'yyyy-mm-dd hh24:mi:ss') - trunc(sysdate, 'dd'))
2 from dual
3 /
(TO_DATE('2003-06-0200:05:00'
-----------------------------
.003472222
(to_date('2003-06-02 00:05:00', 'yyyy-mm-dd hh24:mi:ss') - trunc(sysdate, 'dd')) 的值是0.003472222,trunc后等于0,0*288=0。Top
2 楼Lastdrop(空杯)回复于 2003-06-02 13:01:45 得分 0
Sorry,是因为
SQL> select .003472222*288 from dual;
.003472222*288
--------------
.999999936
trunc函数的意思是取整数部分,而不会四舍五入,所以
SQL> select trunc(.003472222*288) from dual;
TRUNC(.003472222*288)
---------------------
0Top
3 楼pdv()回复于 2003-06-02 13:13:49 得分 0
我的情况是这样的:
我有一张表,有一个fdt的字段
我要统计每5分钟的情况:[00:00:00,00:00:05)为第一个间隔,[5,10)为第二个间隔
表有好几十万条记录,但是又不能建索引
我想用一个select语句搞定,
所以只能出次下策
group by trunc((fdt-:day)*1440/5)+1
:day为某天的开始时间
但是存在上诉问题,不知道有没有别的高招Top
4 楼BlueskyWide(谈趣者)回复于 2003-06-02 13:27:55 得分 0
请参考:
SQL> select trunc(0.99) from dual;
TRUNC(0.99)
-----------
0
SQL> select 0.99 from dual;
0.99
----------
.99
Top
5 楼BlueskyWide(谈趣者)回复于 2003-06-02 13:31:24 得分 0
参考相关函数:
round(value,[scale])
floor(value)
cell(value)
Top
6 楼Lastdrop(空杯)回复于 2003-06-02 13:31:45 得分 0
group by trunc((fdt-:day)*1440/5)+1
不知道你是不是想四舍五入,也就是你希望trunc(...)之后的结果为1,而不是零是吗?
可以
group by trunc((fdt-:day)*1440/5 + 0.5)+1
或者
group by ceil((fdt-:day)*1440/5)+1
Top
7 楼BlueskyWide(谈趣者)回复于 2003-06-02 13:45:22 得分 0
写一个计算5*60的秒级时间函数,用于计算两日期的时间差。
Top
8 楼beckhambobo(beckham)回复于 2003-06-02 13:46:48 得分 0
http://download-west.oracle.com/docs/cd/A87860_01/doc/server.817/a85397/function.htm#80101
有详细说明两面个函数区别Top
9 楼BlueskyWide(谈趣者)回复于 2003-06-02 13:58:47 得分 0
to beckhambobo:
记得斑竹以前贴用过,该网站现打不开,再贴一次吧。
Top




