1

我在使用 T-SQL 中的自定义日期时遇到了一个问题,我们有一个客户端使用不同的方法startend他的月份,而不是默认01的开始月份和结束的日期3130或者29是月份开始在当天2625下个月结束。

例如,通常如何:

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

所以,为了这个需求,我必须用这种自定义方式计算这个客户从一月到现在每月做了多少销售......我该怎么做?

我想通过本月确定执行的查询结果示例:

在此处输入图像描述

4

1 回答 1

4

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

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这样您就可以添加索引而不必担心计算。

或者,更好的是,添加一个calendar表格,您可以在其中查找任何(合理的)日期的财政月份。

于 2020-10-21T13:52:08.147 回答