2008-10-06 12 views
14

Jeśli mam pole datetime, w jaki sposób mogę uzyskać tylko rekordy utworzone później niż w określonym czasie, ignorując datę w ogóle?Jak uzyskać rekordy po pewnym czasie przy użyciu pola daty SQL SQL

To tablica rejestrowania, która informuje, kiedy ludzie łączą się i robią coś w naszej aplikacji. Chcę się dowiedzieć, jak często ludzie są dostępni po godzinie 17:00.

(. Niestety - jest to SQL Server ale może to być użyteczne dla innych ludzi, dla innych baz)

Odpowiedz

1

Najlepszą rzeczą, jaką mogę myśleć byłoby: nie używaj pola DateTime; cóż, można użyć dużo DATEADD/DATEPART itp., ale będzie to powolne, jeśli masz dużo danych, ponieważ nie może naprawdę korzystać z indeksu tutaj. Twoja baza danych może oferować odpowiedni typ natywnie - taki jak typ TIME w SQL Server 2008 - ale równie łatwo można zapisać przesunięcie czasowe w minutach (na przykład).

5

Jakiego systemu baz danych używasz? Funkcje daty/czasu różnią się znacznie.

Dla Oracle, można powiedzieć

SELECT * FROM TABLE 
    WHERE TO_CHAR(THE_DATE, 'HH24:MI:SS') BETWEEN '17:00:00' AND '23:59:59'; 

Ponadto, prawdopodobnie trzeba przewróceniu do następnego dnia, a także wybrać razy między północą a, powiedzmy, 6 rano.

+1

ten nie powróci wiersze z 1/2 sekundy do północy. Dlaczego nie tylko> = '17: 00: 00 '. – Joe

+0

@Joe: actually> = '17: 00: 00 'lub even> =' 17 'powinno również zadziałać, myślę, że – Thilo

0

Ok, mam to.

select myfield1, 
     myfield2, 
     mydatefield 
    from mytable 
where datename(hour, mydatefield) > 17 

To dostanie mi rekordy z mydatefieldem z czasem późniejszym niż 17.00.

+0

Możesz również pomyśleć o prawdziwych wczesnych godzinach porannych i uwzględnić wszystko przed 6 rano lub coś podobnego. .. – Thilo

+0

W tym przypadku, nie obchodzi mnie to, ale widzę, że byłoby to coś do rozważenia w innych przypadkach (staram się tylko dowiedzieć, kiedy ludzie są ogólnie na zewnątrz, więc możemy zaplanować trochę db konserwacji). – thursdaysgeek

4

W MySQL, to byłoby

where time(datetimefield) > '17:00:00' 
0

W Informix, zakładając, że używasz rok DATETIME DO drugiego pola posiadać pełną datę, można napisać:

WHERE EXTEND(dt_column, HOUR TO SECOND) > DATETIME(17:00:00) HOUR TO SECOND 

„EXTEND "rzeczywiście może skontrować zestaw pól (jak również rozszerzyć go, jak sugeruje nazwa).

Jak zauważył Thilo, jest to obszar o skrajnej zmienności między DBMS (a Informix jest z pewnością jednym z wariantów).

1

dla MSSQL użyciu metody CONVERT:


DECLARE @TempDate datetime = '1/2/2016 6:28:03 AM' 
SELECT 
    @TempDate as PassedInDate, 
    CASE 
     WHEN CONVERT(nvarchar(30), @TempDate, 108) < '06:30:00' then 'Before 6:30am' 
     ELSE 'On or after 6:30am' 
    END, 
    CASE 
     WHEN CONVERT(nvarchar(30), @TempDate, 108) >= '10:30:00' then 'On or after 10:30am' 
     ELSE 'Before 10:30am' 
    END 
Powiązane problemy