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?

20
demandé sur Revious 2012-08-10 15:11:32

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)
22
répondu Brian 2012-09-07 00:43:36
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.
10
répondu Gaurav Soni 2015-02-02 09:47:40

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).

9
répondu David Faber 2012-09-06 12:54:06

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
7
répondu Lunc 2012-09-06 12:52:59
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
2
répondu Nick Krasnov 2012-09-06 14:13:50