2013-08-07 15 views
7

Ho appena funzionare questa domandaSQL query di ricerca Data utilizzando Tra

Select * 
from ProjectData 
where logtime between '2012-09-25 12:00:00.000' and '2012-09-25 12:59:59.999' 
order by LogTime 

nel tentativo di trovare il record di tutti per 12 ore, abbiamo registrare ogni secondo, quindi mi aspettavo 3600 record, ma con mia grande sorpresa ho ottenuto record 3601 e l'ultimo tempo record è stato

2012-09-25 13:00:00.000 

Qualche idea del motivo per cui questo record viene selezionato? Anche se Between include i valori specificati, questo valore è superiore alla condizione. Sto usando SQL Server 2012 Express Edition.

+1

Potrebbe essere che l'acuracy del vostro campo datetime della tabella non consente una sottile distinzione, quali? I. e. può davvero mantenere date come '2012-09-25 12: 59: 59.999' e' 2012-09-25 13: 00: 00.000' a parte? Potrebbe essere necessario limitare la ricerca entro il 2012-09-25 12: 59: 59' come condizione superiore? – cars10m

+0

Ho un tipo di dati come DateTime e quando interrogo la tabella, viene visualizzato il tempo in millisecondi. Quindi immagino che li immagazzini così? O –

+3

'DATETIME' ha una precisione di 3,33ms - quindi nel tuo caso il tuo secondo valore sarà" arrotondato "a' 2012-09-25 13: 00: 00,000' poiché 'DATETIME' può contenere valori che terminano con'. 990', '.993',' .997' e '.000'. O usi 'DATETIME2' invece (precisione molto più alta!), O usa' '2012-09-25 12: 59: 59.997'' per il tuo secondo valore se sei bloccato su 'DATETIME' –

risposta

9

tenta di utilizzare DATETIME2 tipo di dati per la colonna logtime -

Query:

DECLARE @temp TABLE (logtime DATETIME2) 
INSERT INTO @temp (logtime) 
VALUES 
    ('20120925 12:00:00.000'), 
    ('20120925 12:59:59.999'), 
    ('20120925 13:00:00.000') 

SELECT * 
FROM @temp 
WHERE logtime BETWEEN '2012-09-25 12:00:00.000' AND '2012-09-25 12:59:59.999' 
ORDER BY logtime 

uscita:

logtime 
--------------------------- 
2012-09-25 12:00:00.0000000 
2012-09-25 12:59:59.9990000 

DATETIME vs DATETIME2:

SELECT name, [precision] 
FROM sys.types 
WHERE name IN ('datetime', 'datetime2') 

uscita:

name  precision 
----------- --------- 
datetime2 27 
datetime 23 
+0

in base al tuo suggerimento Ho eseguito Seleziona * da Project_5_Data dove Cast (logtime come DateTime2) tra '2012-09-25 12: 00: 00.000 'e' 2012-09-25 12: 59: 59.999 'ordina per LogTime e mostra i risultati corretti. Quindi sorge un'altra domanda se DateTime non supporta il millisecondo perché mostra che in output? –

+3

'DATETIME2' è una nuova informazione per me. grazie Devart +1 – Nithesh

+0

@Devart: bella risposta. Puoi spiegare questo comportamento di DateTime? –

1

Prova che esegue la query

SELECT CAST('2012-09-25 12:59:59.999' AS DATETIME) 

Ciò uscite 2012-09-25 13:00:00.000. Quindi penso che sia il motivo per cui il risultato contiene il record con il tempo 2012-09-25 13:00:00.000.

Quindi in realtà si seleziona valori compresi tra 2012-09-25 12:00:00.000 e 2012-09-25 13:00:00.000

+0

sì, ma perché è la mia domanda ... DateTime sul mio server mostra millisecondo quindi, supporta quel formato e quindi non dovrebbe arrotondarlo. –

+1

in realtà supporta i millisecondi ma c'è una perdita di precisione durante la conversione da stringa a datetime e arrotonda i valori in aumento di 0.000, 0,003, 0,007. Vedere questo collegamento per maggiori dettagli http://msdn.microsoft.com/en-us/library/ms187819.aspx –

4

Hai preso Datetime come tipo di dati e ha la proprietà di ottenere arrotondato.

Datetime i valori sono arrotondati a incrementi di .000, .003 o .007 secondi. Dettagli here
Esempio:

SQL Fiddle

Setup MS SQL Server 2012 Schema:

Query 1:

Declare @testtime datetime = '2012-09-25 12:59:59.999' 

select @testtime 

Results:

|       COLUMN_0 | 
------------------------------------ 
| September, 25 2012 13:00:00+0000 | 
Problemi correlati