SQL Server GROUP BY datetime ігнорувати годину хвилину та вибір із датою та значенням суми


86

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


1
прийняти одну з відповідей було б непогано ( це може зробити лише той, хто
задає питання

Відповіді:


135
SELECT CAST(Datetimefield AS DATE) as DateField, SUM(intfield) as SumField
FROM MyTable
GROUP BY CAST(Datetimefield AS DATE)

11
Це буде працювати лише в SQL Server 2008+ (коли був введений тип даних Date). Якщо ви знаходитесь у 2005 році або раніше, зміна акторського складу на конвертацію (перетворення (int, Datetimefield), datetime) має спрацювати.
Дерек Кромм,

Я отримую повідомлення про помилку, сказавши, що „Тип дати не є визначеним типом системи“.
Стівен

5
@Steven - тоді дивіться коментар Дерека. Ось чому доцільно включити до запитання свою ВЕРСІЮ .
JNK

@Derek, здається, це не працює. select convert(convert(int, getdate()), datetime)Зазнає невдачі з неправильним синтаксичну помилку
rabudde

1
вибачте, конвертуйте (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)

У старих версіях, таких як 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_Вже

Не могли б ви пояснити, що таке "dd"? Я не розумію, що ти повинен там вкласти.
BelovedFool

"dd" - це дата, еквівалентна дню. Ви також можете використовувати "день", "д" або "дд"
Джефферсон Сільва

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

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;
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.