Как группировать по месяцам из поля Date с помощью sql
Как я могу группировать только по месяцам из поля даты (а не по дням)?
Вот как выглядит мое поле даты:
2012-05-01
Вот мой текущий SQL:
select Closing_Date, Category, COUNT(Status)TotalCount from MyTable
where Closing_Date >= '2012-02-01' and Closing_Date <= '2012-12-31'
and Defect_Status1 is not null
group by Closing_Date, Category
Ответы
Ответ 1
Я бы использовал это:
SELECT Closing_Date = DATEADD(MONTH, DATEDIFF(MONTH, 0, Closing_Date), 0),
Category,
COUNT(Status) TotalCount
FROM MyTable
WHERE Closing_Date >= '2012-02-01'
AND Closing_Date <= '2012-12-31'
AND Defect_Status1 IS NOT NULL
GROUP BY DATEADD(MONTH, DATEDIFF(MONTH, 0, Closing_Date), 0), Category;
Это будет группироваться по первому из каждого месяца, поэтому
`DATEADD(MONTH, DATEDIFF(MONTH, 0, '20130128'), 0)`
даст '20130101'
. Обычно я предпочитаю этот метод, поскольку он сохраняет даты как даты.
В качестве альтернативы вы можете использовать что-то вроде этого:
SELECT Closing_Year = DATEPART(YEAR, Closing_Date),
Closing_Month = DATEPART(MONTH, Closing_Date),
Category,
COUNT(Status) TotalCount
FROM MyTable
WHERE Closing_Date >= '2012-02-01'
AND Closing_Date <= '2012-12-31'
AND Defect_Status1 IS NOT NULL
GROUP BY DATEPART(YEAR, Closing_Date), DATEPART(MONTH, Closing_Date), Category;
Это действительно зависит от вашего желаемого результата. (Год закрытия не нужен в вашем примере, но если диапазон дат пересекает границу года, это может быть).
Ответ 2
Используйте функцию DATEPART, чтобы извлечь месяц с даты.
Итак, вы сделали бы что-то вроде этого:
SELECT DATEPART(month, Closing_Date) AS Closing_Month, COUNT(Status) AS TotalCount
FROM t
GROUP BY DATEPART(month, Closing_Date)
Ответ 3
Я попробовал решение user1845584. sql дал ошибку в поле Категория. Поэтому я удалил его, и он сработал. Также я добавил:
select Year(Closing_Date), Month(Closing_Date)"
Это было лучше. Это означает, что я перечислил счет в соответствии с годом и месяцем.
Ответ 4
Я использовал FORMAT, чтобы выполнить следующее:
select
FORMAT(Closing_Date, 'yyyy_MM') AS Closing_Month
, count(*) cc
FROM
MyTable
WHERE
Defect_Status1 IS NOT NULL
AND Closing_Date >= '2011-12-01'
AND Closing_Date < '2016-07-01'
GROUP BY FORMAT(Closing_Date, 'yyyy_MM')
ORDER BY Closing_Month
Ответ 5
Добавив MONTH(date_column)
в GROUP BY
.
SELECT Closing_Date, Category, COUNT(Status)TotalCount
FROM MyTable
WHERE Closing_Date >= '2012-02-01' AND Closing_Date <= '2012-12-31'
AND Defect_Status1 IS NOT NULL
GROUP BY MONTH(Closing_Date), Category
Ответ 6
Вы можете сделать это, используя Year(), Month() Day() и datepart().
В вашем примере это будет:
select Closing_Date, Category, COUNT(Status)TotalCount from MyTable
where Closing_Date >= '2012-02-01' and Closing_Date <= '2012-12-31'
and Defect_Status1 is not null
group by Year(Closing_Date), Month(Closing_Date), Category