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

2019-10-08

Иногда нам нужно выбрать значения, сгруппированные по месяцам из таблицы 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]) ;