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

che mi aspetterei non mi dare alcun risultato ... TRANNE sto ottenendo un record con un datetime di 2010-07-20 03:21:52.577SQL Server millisecondi Remove from datetime

come posso fare la domanda ignorare millisecondi?

+0

Se si inserisce codice (SQL) o XML, ** per favore ** evidenziare tali righe nell'editor di testo e fare clic sul pulsante "codice" (101 010) sulla barra degli strumenti dell'editor per formattarlo in modo appropriato e sintassi evidenziarlo! –

risposta

60

Basta devi calcolare la parte in millisecondo della data e sottrarla prima del confronto, come questa:

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' 

Dovrete assettare millisecondi prima del confronto, che sarà lenta su più righe

fare uno di questi per risolvere questo problema:

  • ha creato una colonna calcolata con le espressioni di cui sopra confrontare
  • rimuovere millisecondi su inserimento/aggiornamento per evitare l'overhead di lettura
  • Se SQL Server 2008, utilizzare datetime2(0)
+1

datetime2 è la migliore soluzione (meno costosa) IMO – vacip

+1

@vacip: nel 2010 ci sarebbe stato meno SQL Server 2008+ e più SQL Server 2005 che non avevano datetime2 – gbn

13

Prova:

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

Oppure, se la data è un valore datetime reale:

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

La conversione in stile 120 tagli al largo delle millisecondi ...

+0

Mostra ancora le ultime 3 cifre zero –

+0

'CONVERT (DATETIME , CONVERT (VARCHAR (20), @date, 120)) 'è un'ottima soluzione per confrontare i valori DateTime ignorando i millisecondi. Grazie. – Kon

8

Per questa query particolare, perché fare la funzione costose chiamate per ogni riga quando si può solo chiedere per i valori a partire al prossimo secondo più alto:

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

C'è più di un modo per farlo:

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 meno chiamata di funzione, ma y Devi stare attento a traboccare il numero intero massimo se le date sono troppo distanti.

0

Un altro modo in cui ho impostato le query di SQL Server per ignorare i millisecondi quando cerco eventi da un secondo particolare (in un parametro nel formato "AAAA-MM-GG HH: TT: SS") utilizzando un stored procedure:

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

È possibile utilizzare qualcosa di simile per ignorare minuti e secondi.

1

Si prega di provare questo

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


(No column name) 
12:20:19 
0

Può essere che questo vi aiuterà .. SELECT [Datetime] = CAST ('20.120.228' AS smalldatetime)

o/p: 2012-02-28 00:00:00

4

Se si utilizza SQL Server (a partire da 2008), scegliere uno di questi:

  • CONVERT (DATETIME2 (0), YourDateField)
  • LEFT (RTRIM (CONVERT (datetimeoffset, YourDateField)), 19)
  • CONVERT (datetimeoffset (0), YourDateField) - - con l'aggiunta di un ti Mi Differenza
0

Usa CAST con i seguenti parametri:

Data

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

uscita: 2017-10-11

Datetime

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

uscita: 2017/10/11 14: 38: 50,440

SMALLDATETIME

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

uscita: 2017-10-11 14:39:00

datetimeoffset

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

uscita: 2017/10/11 14: 38: 50,4,4 milioni +00: 00

Datetime2

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

uscita: 2017/10/11 14: 38: 50,4400000

-1

Usa 'Smalldatetime 'tipo di dati

selezionare Converti (smalldatetime, GETDATE())

preleverà 2015/01/08 15:27:00

Problemi correlati