Начало месяца из даты в 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]) ;
Консультирую по продукту, собираю MVP и учу делать продукты самостоятельно. Поработать со мной →