【问题标题】:Generate custom start and end of months in SQL Server在 SQL Server 中生成自定义开始和结束月份
【发布时间】:2021-02-04 10:39:44
【问题描述】:

我在使用 T-SQL 中的自定义日期时遇到了一个问题,我们有一个客户端使用不同的方法,即他月份的 startend,而不是默认日期 01月份以313029 结束,月份从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

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

本月确定要执行的查询结果示例:

【问题讨论】:

    标签: sql sql-server date tsql


    【解决方案1】:

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

    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 表,您可以在其中查找任何(合理的)日期的财政月份。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-25
      • 1970-01-01
      相关资源
      最近更新 更多