Начало месяца из даты в MS SQL (противоположность функции EOMONTH)

Иногда нам нужно выбрать значения, сгруппированные по месяцам, из таблицы MS SQL. Вероятно, самый простой способ сделать это — вызвать функцию DateAdd с DateDiff:

SELECT Sum(YourColumn), DATEADD(month, DATEDIFF(month, 0, [YourDateColumn]), 0) as 'Date'
FROM YourTable
GROUP BY DATEADD(month, DATEDIFF(month, 0, [YourDateColumn]), 0);

Или мы можем использовать функцию EOMONTH, которая даёт нам дату последнего дня месяца:

SELECT Sum(YourColumn),  EOMONTH([YourDateColumn]) as 'Date'
FROM YourTable
GROUP BY EOMONTH([YourDateColumn]) ;

Но обычно удобнее использовать первый день месяца. Поэтому, если вы хотите сэкономить время и сделать скрипт более понятным, можете создать свою собственную функцию, как EOMONTH:

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE FUNCTION [dbo].[SOMONTH] (@dd datetime)
   RETURNS date

AS
BEGIN
    declare @YYYY_MM_DD datetime;

    SET @YYYY_MM_DD = DATEADD(month, DATEDIFF(month, 0, @dd), 0);

    return @YYYY_MM_DD
END

Теперь мы можем её вызвать:

SELECT Sum(YourColumn),  SOMONTH([YourDateColumn]) as 'Date'
FROM YourTable
GROUP BY SOMONTH([YourDateColumn]) ;