SQL Server GROUP BY data i godzina pomija godzinę i minutę, a wybór zawiera datę i wartość sumaryczną

86

Mam stół z dwoma polami - datetimei int. Chcę datetimeumówić się na spotkanie tylko w dniu, ignorując godzinę i minuty. SELECTStwierdzenie powinno powrócić datę, która mapuje do sumy int jednego dnia.

Steven
źródło
1
przyjęcie jednej z odpowiedzi byłoby miłe ( tylko
pytający

Odpowiedzi:

135
SELECT CAST(Datetimefield AS DATE) as DateField, SUM(intfield) as SumField
FROM MyTable
GROUP BY CAST(Datetimefield AS DATE)
JNK
źródło
11
Będzie to działać tylko w SQL Server 2008+ (kiedy wprowadzono typ danych Date). Jeśli masz rok 2005 lub wcześniej, zmiana rzutowania na konwersję (convert (int, Datetimefield), datetime) powinna działać.
Derek Kromm
Pojawia się błąd informujący, że „Data typu nie jest zdefiniowanym typem systemu”.
Steven
5
@Steven - zobacz komentarz Dereka. Dlatego dobrze jest uwzględnić swoją WERSJĘ w pytaniu.
JNK,
@Derek to nie działa. select convert(convert(int, getdate()), datetime)Nie ze złej błąd składni
rabudde
1
przepraszam, konwertuj (datetime, convert (int, getdate ()))
Derek Kromm
24

Ponieważ nie sprecyzował, jakiej wersji serwera SQL używa ( datetyp nie jest dostępny w 2005 roku), można go było również użyć

SELECT CONVERT(VARCHAR(10),date_column,112),SUM(num_col) AS summed
FROM table_name
GROUP BY CONVERT(VARCHAR(10),date_column,112)
rabudde
źródło
W starszych wersjach, takich jak 2000/2005, konwersja varchar na tę potrzebę jest wolniejsza niż użycieDATEADD(dd, DATEDIFF(dd, 0, date_field),0)
Used_By_Already
7

Przyszedłem badać opcje, które musiałbym zrobić, jednak uważam, że metoda, której używam, jest najprostsza:

SELECT COUNT(*), 
       DATEADD(dd, DATEDIFF(dd, 0, date_field),0) as dtgroup 
FROM TABLE 
GROUP BY DATEADD(dd, DATEDIFF(dd, 0, date_field),0) 
ORDER BY dtgroup ASC;
Jefferson Silva
źródło
1
Działa to w dowolnej wersji programu SQL Server i jest szybsze niż korzystanie z konwersji varchar.
Used_By_Already
Czy mógłbyś wyjaśnić, co to jest „dd”? Nie rozumiem, co masz w tym umieścić.
BelovedFool
„dd” jest częścią daty odpowiadającą dniu. Możesz też użyć „dzień”, „d” lub „dd”
Jefferson Silva,
3

- Podoba mi się to, ponieważ typ danych i format pozostają zgodne z typem danych daty i godziny

;with cte as(
    select 
        cast(utcdate as date) UtcDay, DATEPART(hour, utcdate) UtcHour, count(*) as Counts
    from dbo.mytable cd 
    where utcdate between '2014-01-14' and '2014-01-15'
    group by
        cast(utcdate as date), DATEPART(hour, utcdate)
)
select dateadd(hour, utchour, cast(utcday as datetime)) as UTCDateHour, Counts
from cte
SqlHog
źródło
2

Osobiście wolę funkcję formatowania, która pozwala bardzo łatwo zmienić część daty.

     declare @format varchar(100) = 'yyyy/MM/dd'
     select 
        format(the_date,@format), 
        sum(myfield) 
     from mytable 
     group by format(the_date,@format) 
     order by format(the_date,@format) desc;
Krik
źródło