SQL Server GROUP BY datetime игнорирует час, минуту и ​​выбор со значением даты и суммы

86

У меня есть таблица с двумя полями - datetimeи int. Я хочу сделать группу datetimeтолько по дате, игнорируя час и минуту. SELECTЗаявление должно возвращать дату , которая отображает на сумму междунара одного дня.

Стивен
источник
1
было бы неплохо принять один из ответов ( это может сделать только
спрашивающий

Ответы:

136
SELECT CAST(Datetimefield AS DATE) as DateField, SUM(intfield) as SumField
FROM MyTable
GROUP BY CAST(Datetimefield AS DATE)
JNK
источник
11
Это будет работать только в SQL Server 2008+ (когда был введен тип данных Date). Если вы находитесь в 2005 году или ранее, изменение преобразования на convert (convert (int, Datetimefield), datetime) должно работать.
Дерек Кромм,
Я получаю сообщение об ошибке «Тип Дата не является определенным типом системы».
Стивен,
5
@ Стивен - тогда см. Комментарий Дерека. Вот почему рекомендуется указать вашу ВЕРСИЮ в вопросе.
JNK
@ Дерек, похоже, это не работает. Ошибка select convert(convert(int, getdate()), datetime)с неправильной синтаксической ошибкой
rabudde
1
извините, convert (datetime, convert (int, getdate ()))
Дерек Кромм,
24

Поскольку он не указал, какую версию SQL-сервера он использует ( dateтип недоступен в 2005 году), можно также использовать

SELECT CONVERT(VARCHAR(10),date_column,112),SUM(num_col) AS summed
FROM table_name
GROUP BY CONVERT(VARCHAR(10),date_column,112)
Rabudde
источник
В более старых версиях, таких как 2000/2005, преобразование varchar для этой потребности происходит медленнее, чем использованиеDATEADD(dd, DATEDIFF(dd, 0, date_field),0)
Used_By_Already
7

Я приехал изучать варианты, которые мне нужно было бы сделать, однако я считаю, что метод, который я использую, самый простой:

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
Это будет работать в любой версии SQL Server и быстрее, чем при использовании преобразований varchar.
Used_By_Already
Не могли бы вы уточнить, что такое "дд"? Я не понимаю, что вы должны туда вставить.
BelovedFool
«дд» - часть даты, эквивалентная дню. Вы также можете использовать «день», «д» или «дд»
Джефферсон Сильва
3

- Мне это нравится, поскольку тип данных и формат остаются совместимыми с типом данных даты и времени.

;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
источник
2

Лично я предпочитаю функцию форматирования, которая позволяет очень легко изменить часть даты.

     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;
Крик
источник