2010-07-20 33 views
37
select * 
from table 
where date > '2010-07-20 03:21:52' 

lo cual esperaría que no me dio ningún resultado ... excepto que estoy recibiendo un registro con una fecha y hora de 2010-07-20 03:21:52.577de fecha y hora

cómo puedo realizar la consulta ignorar milisegundos?

+0

Si publica código (SQL) o XML, ** por favor ** resalte esas líneas en el editor de texto y haga clic en el botón "código" (101 010) en la barra de herramientas del editor para formatear y resaltar la sintaxis. –

Respuesta

60

Sólo tiene que averiguar la parte en milisegundos de la fecha y restarla antes de la comparación, como esta:

select * 
from table 
where DATEADD(ms, -DATEPART(ms, date), date) > '2010-07-20 03:21:52' 
16
select * from table 
    where DATEADD(ms, DATEDIFF(ms, '20000101', date), '20000101') > '2010-07-20 03:21:52' 

Vas a tener que recortar milisegundos antes de la comparación, que será lenta en muchas filas

hacer una de estas para solucionar este problema:

  • creó una columna calculada con las expresiones anteriores para comparar con
  • eliminar milisegundos en insertar/actualizar para evitar la sobrecarga de lectura
  • Si SQL Server 2008, utilice datetime2(0)
+1

datetime2 es la mejor (menos costosa) solución IMO – vacip

+1

@vacip: en 2010 habría habido menos SQL Server 2008+ y más SQL Server 2005 que no tenían datetime2 – gbn

13

Probar:

SELECT * 
FROM table 
WHERE datetime > 
CONVERT(DATETIME, 
CONVERT(VARCHAR(20), 
CONVERT(DATETIME, '2010-07-20 03:21:52'), 120)) 

O si su fecha es un valor de fecha y hora actual:

DECLARE @date DATETIME 
SET @date = GETDATE() 
SELECT CONVERT(DATETIME, CONVERT(VARCHAR(20), @date, 120)) 

La conversión al estilo de 120 milisegundos corta la ...

+0

Todavía muestra los últimos 3 dígitos cero –

+0

'CONVERTIR (DATETIME , CONVERT (VARCHAR (20), @date, 120)) 'es una gran solución para comparar valores de DateTime sin tener en cuenta los milisegundos. Gracias. – Kon

8

Para esta consulta en particular, ¿por qué hacer la función caros llamadas para cada fila cuando uno podía pedir los valores a partir de la siguiente más alta en segundo lugar:

select * 
from table 
where date >= '2010-07-20 03:21:53' 
1

Hay más de una manera de hacerlo:

select 1 where datediff(second, '2010-07-20 03:21:52', '2010-07-20 03:21:52.577') >= 0 

o

select * 
from table 
where datediff(second, '2010-07-20 03:21:52', date) >= 0 

uno menos llamada a la función, pero y Debe tener cuidado de desbordar el entero máximo si las fechas están demasiado separadas.

0

Una forma más de configurar las consultas del Servidor SQL para ignorar los milisegundos cuando estoy buscando eventos de un segundo en particular (en un parámetro en formato "AAAA-MM-DD HH: TT: SS") usando un procedimiento almacenado:

WHERE 
    ...[Time_stamp] >= CAST(CONCAT(@YYYYMMDDHHTTSS,'.000') as DateTime) AND 
    ...[Time_stamp] <= CAST(CONCAT(@YYYYMMDDHHTTSS,'.999') as DateTime) 

Usted podría utilizar algo similar a ignorar minutos y segundos también.

1

Inténtelo este

select substring('12:20:19.8470000',1,(CHARINDEX('.','12:20:19.8470000',1)-1)) 


(No column name) 
12:20:19 
0

Puede ser que esto ayudará a .. SELECT [Fecha y hora] = CAST ('20120228' AS smalldatetime)

O/P: 2012-02-28 00:00:00

4

Si está utilizando SQL Server (a partir de 2008), elija uno de esto:

  • CONVERT (DATETIME2 (0), YourDateField)
  • LEFT (RTRIM (CONVERTIR (DateTimeOffset, YourDateField)), 19)
  • CONVERT (DateTimeOffset (0), YourDateField) - - con la adición de un ti Me zona Offset
0

Uso REPARTO con los parámetros siguientes:

Fecha

select Cast('2017-10-11 14:38:50.440' as date) 

de salida: 2017-10-11

de fecha y hora

select Cast('2017-10-11 14:38:50.440' as datetime) 

de salida: 11/10/2017 14: 38: 50,440

SMALLDATETIME

select Cast('2017-10-11 14:38:50.440' as smalldatetime) 

de salida: 2017-10-11 14:39:00

DateTimeOffset

select Cast('2017-10-11 14:38:50.440' as datetimeoffset) 

salida: 11/10/2017 14: 38: 50.4400000 00: 00

datetime2

select Cast('2017-10-11 14:38:50.440' as datetime2) 

de salida: 10/11/2017 14: 38: 50,4400000

-1

Uso 'Smalldatetime 'tipo de datos

select convert (smalldatetime, getdate())

buscará 08/01/2015 15:27:00

Cuestiones relacionadas