在SQL Server中生成自定义的月初和月底

在SQL Server中生成自定义的月初和月底,sql,sql-server,date,tsql,Sql,Sql Server,Date,Tsql,我在使用T-SQL中的自定义日期时遇到了一个问题,我们有一个客户端,它使用不同的方法来处理其月份的start和end,而不是使用默认的日期01来开始月份并以31、30或29结束,该月从下个月的第26天开始,到第25天结束 例如,通常情况下: select sum(sales) as sales from sales where salesDate between '2020-09-01' and '2020-09-30' -- or left(salesDate,7) = '2020-09'

我在使用T-SQL中的自定义日期时遇到了一个问题,我们有一个客户端,它使用不同的方法来处理其月份的
start
end
,而不是使用默认的日期
01
来开始月份并以
31
30
29
结束,该月从下个月的第26天开始,到第25天结束

例如,通常情况下:

select sum(sales) as sales
from sales
where salesDate between '2020-09-01' and '2020-09-30'
-- or left(salesDate,7) = '2020-09'
客户自定义月份:

select sum(sales) as sales
from sales
where salesDate between '2020-08-26' and '2020-09-25' -- for setember
所以,为了满足这个需求,我必须计算这个客户从一月份到现在的每月销售量,用这种定制方式。。。我该怎么做

我希望对本月确定执行的查询结果示例:


这是一个非常糟糕的情况。一种方法是根据规则构造月份的第一个日期:

select mon, sum(sales) as sales
from sales s cross apply
     (values (case when day(salesdate) >= 26 
                   then dateadd(month, 1, datefromparts(year(salesdate), month(salesdate), 1))
                   else datefromparts(year(salesdate), month(salesdate), 1)
     ) v(mon)
where v.mon >= '2020-01-01'
group by v.mon;
我建议在
salesDate
表中添加会计月列作为持久计算列,这样您就可以添加索引,而不必担心计算


或者,更好的方法是添加一个
日历
表,您可以在其中查找任何(合理的)日期的会计月。

这是一个非常糟糕的情况。一种方法是根据规则构造月份的第一个日期:

select mon, sum(sales) as sales
from sales s cross apply
     (values (case when day(salesdate) >= 26 
                   then dateadd(month, 1, datefromparts(year(salesdate), month(salesdate), 1))
                   else datefromparts(year(salesdate), month(salesdate), 1)
     ) v(mon)
where v.mon >= '2020-01-01'
group by v.mon;
我建议在
salesDate
表中添加会计月列作为持久计算列,这样您就可以添加索引,而不必担心计算

或者,更好的方法是添加一个
日历
表,您可以在其中查找任何(合理)日期的会计月