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)
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)
上面的答案从日期减去了十分之一毫秒.我想你想要的是以下内容:
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)
归档时间: |
|
查看次数: |
22831 次 |
最近记录: |