我认为这很简单,但事实并非如此。
SELECT TO_TIMESTAMP('10/08/2012','DD/MM/YYYY')
- 1/(24*50*60*1000) data
FROM dual;
它根本不起作用。
其他细节:
SELECT TO_TIMESTAMP('10/08/2012','DD/MM/YYYY') -
NUMTODSINTERVAL(1/(24*50*60*1000),'HOUR') data
FROM dual;
不起作用..
右边似乎是
SELECT TO_TIMESTAMP('10/08/2012','DD/MM/YYYY') -
NUMTODSINTERVAL(1/(24*25*60*1000),'HOUR') data
FROM dual;
为什么呢?它是如何工作的?
答案 0 :(得分:26)
要添加或减去以文字表示的时间量,您可以使用INTERVAL。
SELECT TO_TIMESTAMP('10/08/2012','DD/MM/YYYY')
- INTERVAL '0.001' SECOND
FROM dual;
现在,现在有标准方法来表达日期和时间文字,并避免使用各种特定于数据库的转换函数。
SELECT TIMESTAMP '2012-10-08 00:00:00'
- INTERVAL '0.001' SECOND DATA
FROM dual;
对于您的原始问题,一天的时间部分存储在小数天内。所以一秒钟是:
1 / (hours in day * minutes in hour * seconds in a minute)
除以1000得到毫秒。
1 / (24 * 60 * 60 * 1000)
答案 1 :(得分:10)
SELECT TO_TIMESTAMP('10/08/2012','DD/MM/YYYY') - NUMTODSINTERVAL(1/(24*50*60*1000),'HOUR') data
FROM dual;
<强>输出强>
DATA
---------------------------------
09/AUG/12 11:59:59.999950000 PM
1 row selected.
答案 2 :(得分:9)
上面发布的答案从日期中减去了十分之一。我想你想要的是以下内容:
SELECT TO_TIMESTAMP('10/08/2012','DD/MM/YYYY')-NUMTODSINTERVAL(1/1000,'SECOND')
FROM dual;
<强>输出:强>
DATA
---------------------------------------------------------------------------
09-AUG-12 11.59.59.999000000 PM
^^^
|||
tenths|thousandths
|
hundredths
以下NUMTODSINTERVAL(1/(24*25*60*1000),'HOUR')
似乎仅仅因为24 * 25 = 600而起作用。但是这个数字是错误的,因为一小时的1 /(600 * 60 * 1000)是十分之一毫秒,而不是一毫秒。如果您想在NUMTODSINTERVAL()
中使用“HOUR”,则应使用1/(60*60*1000)
(一小时60分钟,一分钟60秒,一秒钟1000毫秒)。
答案 3 :(得分:7)
这是正确的(毫秒是1000秒): -
SELECT TO_TIMESTAMP('10/08/2012','DD/MM/YYYY') - NUMTODSINTERVAL(1/1000,'SECOND') data FROM dual;
DATA
-----------------------------
09-AUG-12 23.59.59.999000000
至于为什么其他代码不起作用,因为你没有正确计算毫秒。一小时必须除以60分给出分钟,再用60分给定秒,然后再给1000分给出一毫秒,因此如果你必须用HOUR作为间隔那么它是: -
SELECT TO_TIMESTAMP('10/08/2012','DD/MM/YYYY') - NUMTODSINTERVAL(1/(60*60*1000),'HOUR') as data FROM dual;
DATA
---------------------------------------------------------------------------
09-AUG-12 23.59.59.999000000
答案 4 :(得分:2)
select TO_CHAR(TO_TIMESTAMP('10.05.2012', 'DD.MM.YYYY') -
NUMTODSINTERVAL(1/1000, 'SECOND'), 'DD.MM.YYYY HH24:MI:SS:FF3') Res
from dual;
RES
-----------------------------
09.05.2012 23:59:59.999