Oracle:从日期时间减去毫秒

Rev*_*ous 21 sql oracle date function

我觉得这很简单,但事实并非如此.

SELECT TO_TIMESTAMP('10/08/2012','DD/MM/YYYY') 
          - 1/(24*50*60*1000) data 
FROM dual;
Run Code Online (Sandbox Code Playgroud)

它根本不起作用.


其他详情:

SELECT TO_TIMESTAMP('10/08/2012','DD/MM/YYYY') -
           NUMTODSINTERVAL(1/(24*50*60*1000),'HOUR') data 
FROM dual;
Run Code Online (Sandbox Code Playgroud)

不起作用..

权利似乎是

SELECT TO_TIMESTAMP('10/08/2012','DD/MM/YYYY') -
           NUMTODSINTERVAL(1/(24*25*60*1000),'HOUR') data 
FROM dual;
Run Code Online (Sandbox Code Playgroud)

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

Bri*_*ian 27

要添加或减去表示为文字的时间量,您可以使用INTERVAL.

SELECT TO_TIMESTAMP('10/08/2012','DD/MM/YYYY')
     - INTERVAL '0.001' SECOND 
FROM dual;
Run Code Online (Sandbox Code Playgroud)

现在还有标准方法来表达日期和时间文字,并避免使用各种特定于数据库的转换函数.

SELECT TIMESTAMP '2012-10-08 00:00:00' 
   - INTERVAL '0.001' SECOND DATA
FROM dual;
Run Code Online (Sandbox Code Playgroud)

对于您的原始问题,一天中的时间部分存储在小数天内.所以一秒钟就是:

1 / (hours in day * minutes in hour * seconds in a minute)
Run Code Online (Sandbox Code Playgroud)

除以1000得到毫秒.

1 / (24 * 60 * 60 * 1000)
Run Code Online (Sandbox Code Playgroud)

  • +1间隔文字肯定是要走的路.格式模型和日期乘法只是等待发生的错误. (2认同)

Gau*_*oni 10

SELECT TO_TIMESTAMP('10/08/2012','DD/MM/YYYY') - NUMTODSINTERVAL(1/(24*50*60*1000),'HOUR') data 
FROM dual;
Run Code Online (Sandbox Code Playgroud)

OUTPUT

DATA                             
---------------------------------
09/AUG/12 11:59:59.999950000 PM  

1 row selected.
Run Code Online (Sandbox Code Playgroud)


Dav*_*ber 9

上面的答案从日期减去了十分之一毫秒.我想你想要的是以下内容:

SELECT TO_TIMESTAMP('10/08/2012','DD/MM/YYYY')-NUMTODSINTERVAL(1/1000,'SECOND')
  FROM dual;
Run Code Online (Sandbox Code Playgroud)

输出:

DATA
---------------------------------------------------------------------------
09-AUG-12 11.59.59.999000000 PM
                   ^^^
                   |||
              tenths|thousandths
                    |
                hundredths
Run Code Online (Sandbox Code Playgroud)

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


小智 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
Run Code Online (Sandbox Code Playgroud)

至于为什么其他代码没有工作,因为你没有正确计算毫秒.一小时必须除以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
Run Code Online (Sandbox Code Playgroud)