Oracle:从日期时间中减去毫秒

Oracle: subtract millisecond from a datetime

提问人:Revious 提问时间:8/10/2012 最后编辑:Revious 更新时间:2/2/2015 访问量:31295

问:

我以为这很简单,但事实并非如此。

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;

为什么?它是如何工作的?

SQL Oracle 函数 日期

评论

0赞 Thinhbk 8/10/2012
我不明白你的意思。您要做什么?
2赞 Gaurav Soni 8/10/2012
@Thinhbk:他想从那个时间戳中减去毫秒,如果你看上面的查询,这只会输出你,实际上他想作为输出。如果我错了,请纠正我.10/AUG/1209/AUG/12 11:59:59.999950000 PM Gik25
0赞 Revious 8/10/2012
从日期中减去一毫秒

答:

11赞 Gaurav Soni 8/10/2012 #1
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.

评论

0赞 Revious 8/10/2012
如何模拟输出?
0赞 Revious 9/6/2012
它没有用..正确的似乎是:SELECT TO_TIMESTAMP('10/08/2012','DD/MM/YYYY') - NUMTODSINTERVAL(1/(24*25*60*1000),'HOUR') data FROM dual;为什么?我不明白。。
0赞 AlikElzin-kilaka 1/28/2015
不工作。 给出错误:FROM 关键字未在预期位置找到SELECT TO_TIMESTAMP('10/08/2012','DD/MM/YYYY') - NUMTODSINTERVAL(1/(24*50*60*1000),'HOUR') data FROM dual;
1赞 Gaurav Soni 2/2/2015
@AlikElzin-kilaka:它对我有用,尝试将文本对齐一行,这很奇怪,但这就是它的工作方式:)
7赞 user672739 9/6/2012 #2

这是正确的(毫秒是 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
9赞 David Faber 9/6/2012 #3

上面发布的答案从日期中减去十分之一毫秒。我认为你想要的是以下几点:

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

以下似乎只有效,因为 24*25 = 600。但这个数字是错误的,因为一小时的 1/(600*60*1000) 是十分之一毫秒,而不是毫秒。如果你想使用'HOUR',你应该使用(一小时六十分钟,一分钟六十秒,一秒1000毫秒)。NUMTODSINTERVAL(1/(24*25*60*1000),'HOUR')NUMTODSINTERVAL()1/(60*60*1000)

3赞 Nick Krasnov 9/6/2012 #4
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
32赞 Brian 9/7/2012 #5

要添加或减去以文字表示的时间量,可以使用 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)

评论

2赞 Jon Heller 9/7/2012
+1 间隔文字绝对是要走的路。格式模型和日期乘法只是等待发生的错误。