Oracle: soustraire milliseconde d'une datetime
je pensais que c'était vraiment simple, mais il ne l'est pas.
SELECT TO_TIMESTAMP('10/08/2012','DD/MM/YYYY')
- 1/(24*50*60*1000) data
FROM dual;
il ne fonctionne tout simplement pas.
d'Autres détails:
SELECT TO_TIMESTAMP('10/08/2012','DD/MM/YYYY') -
NUMTODSINTERVAL(1/(24*50*60*1000),'HOUR') data
FROM dual;
ne fonctionne pas..
droite semble être
SELECT TO_TIMESTAMP('10/08/2012','DD/MM/YYYY') -
NUMTODSINTERVAL(1/(24*25*60*1000),'HOUR') data
FROM dual;
Pourquoi? Comment ça fonctionne?
5 réponses
pour additionner ou soustraire un temps exprimé de façon littérale, vous pouvez utiliser L'intervalle.
SELECT TO_TIMESTAMP('10/08/2012','DD/MM/YYYY')
- INTERVAL '0.001' SECOND
FROM dual;
de plus, il existe maintenant des façons standard d'exprimer la date et l'heure littérale et d'éviter l'utilisation de diverses fonctions de conversion spécifiques à la base de données.
SELECT TIMESTAMP '2012-10-08 00:00:00'
- INTERVAL '0.001' SECOND DATA
FROM dual;
pour votre question originale, la partie temporelle d'une journée est stockée en jours fractionnels. Alors, un deuxième est:
1 / (hours in day * minutes in hour * seconds in a minute)
Diviser par 1000 pour obtenir millisecondes.
1 / (24 * 60 * 60 * 1000)
SELECT TO_TIMESTAMP('10/08/2012','DD/MM/YYYY') - NUMTODSINTERVAL(1/(24*50*60*1000),'HOUR') data
FROM dual;
sortie
DATA
---------------------------------
09/AUG/12 11:59:59.999950000 PM
1 row selected.
La réponse posté ci-dessus soustrait un dixième d'une milliseconde à partir de la date. Je pense que ce que vous voulez est la suivante:
SELECT TO_TIMESTAMP('10/08/2012','DD/MM/YYYY')-NUMTODSINTERVAL(1/1000,'SECOND')
FROM dual;
Sortie:
DATA
---------------------------------------------------------------------------
09-AUG-12 11.59.59.999000000 PM
^^^
|||
tenths|thousandths
|
hundredths
La suite NUMTODSINTERVAL(1/(24*25*60*1000),'HOUR')
ne semble fonctionner que parce que 24 * 25 = 600. Mais ce chiffre est erroné parce que 1 / (600*60*1000) d'une heure est un dixième de milliseconde, pas une milliseconde. Si vous souhaitez utiliser 'HEURE'NUMTODSINTERVAL()
vous devez utiliser 1/(60*60*1000)
(soixante minutes dans une heure, soixante secondes dans une minute, 1000 ms dans une seconde).
c'est correct (avec un milliseconde de 1000ème de seconde):-
SELECT TO_TIMESTAMP('10/08/2012','DD/MM/YYYY') - NUMTODSINTERVAL(1/1000,'SECOND') data FROM dual;
DATA
-----------------------------
09-AUG-12 23.59.59.999000000
quant à savoir pourquoi l'autre code ne fonctionne pas, c'est parce que vous ne calculez pas correctement une milliseconde. Une heure doit être divisée par 60 pour donner des minutes et de nouveau par 60 à des secondes données puis par 1000 pour donner une milliseconde, donc si vous devez utiliser L'heure comme l'intervalle, alors il est:-
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
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