2012-04-05 18 views
5

Sto tentando di creare una query che selezionerà in base a una colonna DateTimeSyncDate.Query da selezionare tra due ore del giorno

Come sfondo, la tabella su cui eseguo le query ottiene le importazioni ogni giorno a migliaia alla stessa ora ogni giorno. Voglio trovare le voci che non sono state importate nell'ora del giorno "normale".

Pertanto, desidero interrogare l'ora nella colonna DateTime tra due volte: diciamo 14: 00-14: 30 (2-230) in QUALSIASI giorno/mese/anno.

SELECT * FROM MyTable 
WHERE DatePart(SyncDate, ..?) BETWEEN (14:00..?) and (14:30..?) 

La funzione DatePart sembra essere quello che mi serve, ma non capisco come applicarla a questa situazione. Il tuo aiuto è molto apprezzato oh ottimo queriers.

EDIT: mi sono sbagliato, sto eseguendo SQL-Server-2005 come mio backend. Scusate!

risposta

21

Visto che siete su SQL Server 2008 , è possibile utilizzare il nuovo tipo di dati TIME:

SELECT * FROM MyTable 
WHERE CAST(SyncDate AS TIME) BETWEEN '14:00' and '14:30' 

Se il back-end non è il 2008 ancora :-) allora avresti bisogno di qualcosa come:

SELECT * FROM MyTable 
WHERE DATEPART(HOUR, SyncDate) = 14 AND DATEPART(MINUTE, SyncDate) BETWEEN 0 AND 30 

da verificare per 14: 00-14: 30 ore.

+0

Strano. Sto eseguendo il 2008, riconosce "tempo" come parola chiave, ma dice che non è un "tipo di sistema definito". – ImGreg

+0

Il back-end del server è in esecuzione nel 2008 o è solo la tua copia di SQL Server Mgmt Studio ?? Controllato su 2008 R2 e dovrebbe funzionare bene .... –

+0

Sei corretto, solo lo studio. Il back-end è la versione MDAC o come posso verificarlo? – ImGreg

2

ne dite di questo ....

select * from MyTable where 
cast(cast(datepart(HH,SyncDate) as char(2)) + cast(datepart(HH,SyncDate) as char(2)) as int) between 1400 and 1430 
+0

Tipo di metodo iffy. Tuttavia, estrai il cast come int e metti gli apostrofi attorno al "1400" e in realtà funziona. +1 per un approccio innovativo. – ImGreg

Problemi correlati