Tengo algunas dificultades para obtener la diferencia entre dos valores de tiempo en SQL. Quiero seleccionar todos los valores que tengan menos de 5 segundos de diferencia entre el inicio y el final del valor de la fecha.

Mis datos se ven así

Stop
-----------------------    
2017-10-04 16:32:06:000

Start
-----------------------    
2017-10-04 16:32:02:000

El escenario anterior sería una de esas llamadas. Mi código en la cláusula where para obtener solo valores en los datos que son menos de 5 segundos:

  datediff(second, cast(stop as int), cast(start as int)) < 5

También probé solo dateiff sin el elenco como int y aún recibí el mismo error:

La conversión falló al convertir el varchar vlue '2017-10-04 20: 58: 46: 000' al tipo de datos int

0
user3120266 13 nov. 2017 a las 21:54

2 respuestas

La mejor respuesta

En lugar de usar datediff(), agregue segundos a la hora de inicio:

where stop < dateadd(second, 5, start)

Debería almacenar la fecha / hora como tipos de fecha / hora, no como cadenas. Sin embargo, al menos tiene un formato estándar, por lo que puede ser explícito sobre los tipos de conversión si lo desea:

where convert(datetime, stop) < dateadd(second, 5, convert(datetime, start))

En realidad, esto es más preciso, porque datediff() cuenta "límites de tiempo" entre dos valores, no segundos reales.

Sin embargo, lo principal con datediff() es que los argumentos no son números enteros. Entonces podrías hacer:

datediff(second, start, stop) < 5

Pero el primer método es mejor.

1
Gordon Linoff 13 nov. 2017 a las 18:59

Esto debería funcionar, no necesitas los moldes para obtener la diferencia en segundos ...

select datediff (SECOND,start, stop) from test

Solo para probarlo ...

select 1 
where ((select datediff (SECOND,start, stop) from test) > 5)

Consulta fechada (): ingrese la descripción de la imagen aquí mesa de prueba:

enter image description here

0
Radu 13 nov. 2017 a las 19:19