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.


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)

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)

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;

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

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;
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.