SQL - DATEDIFF de SQL Server

 
Vista:
Imágen de perfil de Ariagna
Val: 39
Ha mantenido su posición en SQL (en relación al último mes)
Gráfica de SQL

DATEDIFF de SQL Server

Publicado por Ariagna (21 intervenciones) el 21/09/2020 16:21:55
Me encuentro trabajando con SQL Server 2014 y Oracle 19c, necesito obtener la diferencia en microsegundos, segundos, minutos y horas entre dos fechas que tienen un rango de tiempo (ejemplo del formato de fecha: 2020-09-18 08:45:20.365) en ambos gestores y que el resultado obtenido sea el mismo, en SQL Server existe la función DATEDIFF que precisamente cumple esta función, en Oracle por desgracia no, solo puedo realizar la resta de los 2 timestamp y obtengo la diferencia en días, horas, minutos, segundos y milisegundos, por lo cual investigando en internet encontré que para obtener un solo número debo de realizar la conversión correspondiente multiplicando el resultado por la cantidad de microsegundos, segundos, minutos y horas que se tengan, hice esto pero tengo ciertos casos en los que los resultados que obtengo no son los mismos que en SQL Server, por lo que mi pregunta es ¿Saben cuál es la regla de redondeo que utiliza SQL Server con su función DATEDIFF? he tratado de encontrar el sentido teniendo realizando pruebas con un rango de fechas pero no lo encuentro, ejemplo:

SQL Server:
1. SELECT DATEDIFF(minute, '2020-02-29 11:07:47.367','2020-02-28 19:25:22.877'); Resultado:-942
2. SELECT DATEDIFF(minute, '2020-02-27 09:06:55.367','2020-02-26 19:25:22.877'); Resultado:-821
3. SELECT DATEDIFF(minute, '2020-02-10 16:59:59.367','2020-02-10 19:25:22.877'); Resultado:146

Oracle: (poner atención a los segundos por la regla de redondeo)
1. SELECT TO_TIMESTAMP('2020-02-29 11:07:47.367') - TO_TIMESTAMP('2020-02-28 19:25:22.877') FROM DUAL; Resultado: -00 15:42:24.4900 Resultado multiplicando por los min: -942 --los segundos son 24 por lo cual concluí que a partir de 24 segundos el redondeo es hacia abajo
2. SELECT TO_TIMESTAMP( '2020-02-27 09:06:55.367') - TO_TIMESTAMP('2020-02-26 19:25:22.877') FROM DUAL; Resultado: -00 13:41:32.4900 Resultado multiplicando por los min: -821 --los segundos son 32 por lo cual concluí que a partir de 35 segundos el redondeo es hacia abajo
3. SELECT TO_TIMESTAMP( '2020-02-10 16:59:59.367') - TO_TIMESTAMP('2020-02-10 19:25:22.877') FROM DUAL; Resultado: 00 02:25:23.5100 Resultado multiplicando por los min: 145 --los segundos son 23 por lo cual se contradice que el redondeo sea hacia abajo porque SQL Server esta devolviendo 146 es precisamente en ese rango de fecha en el que no se que es lo que toma SQL Server para realizar el redondeo o de donde obtiene ese minuto extra, teniendo este caso me fui con los milisegundos pensando que también los utilice.


Ejemplo tomando en cuenta los milisegundos
De los ejemplos anteriores en Oracle tengo 2 valores que tienen un valor de 49 milisegundos que es en donde el redondeo termina siendo hacia abajo y 1 con 51 milisegundos en donde el redondeo es hacia arriba, por lo que concluí que cuando los milisegundos sean mayores o iguales a 50 se debe de redondear hacia arriba, pero al realizar pruebas con el siguiente rango de fecha esto no fue así:

SQL Server:
4. SELECT DATEDIFF(minute, '2020-02-13 20:01:17.367','2020-02-13 19:25:22.877'); Resultado: -36

Oracle
4. SELECT TO_TIMESTAMP('2020-02-13 20:01:17.367') - TO_TIMESTAMP('2020-02-13 19:25:22.877') FROM DUAL; Resultado: -00 00:35:54.4900 Resultado multiplicando por los min: -35 --los segundos son 54 y los milisegundos son 49 por lo cual no se redondea hacia arriba porque según mis conclusiones el redondeo era cuando los segundos fueran mayores a 22 y los milisegundos mayores a 49

Espero que puedan ayudarme, tengo días revisando esto y no logro encontrarle un sentido:(
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder