sql-server - 以所需格式滚动 3 年的数据
问题描述
开始日期 = 2016-03-01 结束日期 = 2019-02-15
我需要查询/函数,它应该根据开始和结束日期检索以下结果。我有一个查询来构建结果。但是我需要一些查询/函数来在 5 到 10 秒内检索结果集并提高性能
解决方案
我突然想到,您可能正在寻找一个查询来从无到有生成该结果集。在 sqlserver 中,我们可以使用递归 cte:
DECLARE @dateFrom DATE = '2016-03-01'
DECLARE @dateTo DATE = '2019-02-15'
with d as (
SELECT @datefrom as m
UNION ALL
SELECT DATEADD(MONTH,1,reqDate)
FROM d
WHERE DATEADD(MONTH,1,reqDate) <= @dateto
),
SELECT
CONCAT(
DATENAME(MONTH, @dateFrom), ' ',
CASE WHEN MONTH(d.m) < MONTH(@dateFrom) THEN YEAR(d.m) - 1 ELSE YEAR(d.m) END, '-',
DATENAME(MONTH, @dateTo), ' ',
CASE WHEN MONTH(d.m) < MONTH(@dateFrom) THEN YEAR(d.m) ELSE YEAR(d.m) +1 END
) as range,
MONTH(d.m) as month,
d.m as startdate,--do not use spaces in column names
CASE WHEN @dateTo < EOMONTH(d.m) then @dateTo ELSE EOMONTH(d.m) END as enddate --or dateadd 1 month then dateadd -1 day if you don't have eomonth
FROM d
OPTION(MAXRECURSION 0);
推荐阅读
- kubernetes - 无法在具有服务帐户、已创建 ClusterRole 和 ClusterRolebinding 的命名空间中创建部署
- javascript - 如何找到这个 javascript 提示?
- python - 在firebase python django中创建用户时在本地数据库上添加用户
- c# - 使用 CSV Helper 库根据 CSV 是否具有相应的标题动态创建属性
- javascript - 在 node.js 中使用 createWriteStream 创建大文件时 JavaScript 堆内存不足致命错误:达到堆限制分配失败
- haskell - VS Code Haskell 扩展 - 无法确定项目使用的 GHC 版本
- javascript - 反应组件不使用 onChange 事件发送变量值
- python - 即使 CPU 可用,Dask Worker 也会花费大量时间 /Hangs
- python - lambda 上的无服务器 wsgi 错误,但在本地工作正常
- spring-boot - 无法成立。经纪人可能不可用。与吉普斯特