2009-05-19 10 views
14

Sto cercando di interrogare uno specifico intervallo di tempo:tempo determinato intervallo di query in SQL Server

  • cioè 3/1/2009 - 2009/03/31
  • tra 06:00-22:00 ogni giorno
  • mar/mer/gio solo

ho visto che è possibile ottenere dati per un determinato intervallo, ma solo per dall'inizio alla fine e questo è un po 'più specifica. Non ho visto alcun comando di SQL Server che mi avrebbe aiutato direttamente su questo, così qualcun altro ha qualche idea su come formeresti questo?

Ho visto this, ma non credo che sia abbastanza specifico per questo intervallo.

Grazie!

+0

Avete data e ora nella stessa colonna, o separati? –

+0

Stessa colonna: è solo un campo DateTime – Fry

risposta

24

Suppongo che tu voglia tutti e tre quelli come parte dei criteri di selezione. Avrai bisogno di alcune affermazioni nel tuo dove, ma saranno simili al link contenuto nella tua domanda.

SELECT * 
    FROM MyTable 
    WHERE [dateColumn] > '3/1/2009' AND [dateColumn] <= DATEADD(day,1,'3/31/2009') 
     --make it inclusive for a datetime type 
    AND DATEPART(hh,[dateColumn]) >= 6 AND DATEPART(hh,[dateColumn]) <= 22 
     -- gets the hour of the day from the datetime 
    AND DATEPART(dw,[dateColumn]) >= 3 AND DATEPART(dw,[dateColumn]) <= 5 
     -- gets the day of the week from the datetime 

Spero che questo aiuti.

+0

Sei il mio eroe: D – Fry

+1

La sintassi per dateadd è 'DATEADD (datapart, numero, data)' Il campione deve essere: '... <= DATEADD (day, 1, '3/31/2009')' Fonte: [Technet] (http://technet.microsoft.com/en-us/library/ms186819 (v = sql.90) .aspx) – user797717

+0

Sì, ma come lo faresti se il tempo non fosse preciso per ora esatta per esempio se vuoi nel range di tempo dalle 6:15 alle 10:35? – Marko

0
select * from table where 
(dtColumn between #3/1/2009# and #3/31/2009#) and 
(hour(dtColumn) between 6 and 22) and 
(weekday(dtColumn, 1) between 2 and 4) 
+3

Questa è una sintassi SQL Server 2005 valida? Non è secondo il mio SQLServer – Fry

+0

Funziona anche nel 2008? Sembra che le funzioni di data utili siano state prese fino al 2012 per diventare disponibili. – ficuscr

+0

Davvero non penso che sia un vero metodo T-sql. – ficuscr

5

si può provare questo (non ho sql server qui oggi, quindi non posso verificare la sintassi, sorry)

select attributeName 
    from tableName 
where CONVERT(varchar,attributeName,101) BETWEEN '03/01/2009' AND '03/31/2009' 
    and CONVERT(varchar, attributeName,108) BETWEEN '06:00:00' AND '22:00:00' 
    and DATEPART(day,attributeName) BETWEEN 2 AND 4 
+0

Grazie :) È molto simile a quanto suggerito da Giggy. L'ho provato originariamente dopo il suo suggerimento, ma ho deciso di seguire rigorosi segnali di uguaglianza mentre rimuovevano l'ambiguità di quale parte di 'between' è compresa :) – Fry

0

I (usando PostgrSQL su PGadmin4) interrogato per i risultati che sono dopo o in 21 nov 2017 a mezzogiorno, come questo (considerando il formato di visualizzazione delle ore nel mio database):

select * from Table1 where FIELD >='2017-11-21 12:00:00' 
Problemi correlati