当前位置: 首页 > news >正文

sql server 取起始日期到结束日期中自然月最后一天,与日期维度行转列

sql server 取起始日期到结束日期中自然月最后一天,与日期维度行转列,这里记录一下。

这段SQL代码实现了从起始日期到结束日期区间内获取各自然月最后一天,并对库存数据进行行转列处理。主要步骤包括:1)定义日期变量并处理结束日期;2)计算日期区间月份数;3)创建临时表存储各月最后一天;4)查询指定日期区间的库存数据;5)使用PIVOT将日期维度转换为列,展示各物料在不同月末的库存数量。代码特别处理了当日作为结束日期的情况,并考虑了日期区间超过30天的月份计算。
DECLARE @BEGINTIME VARCHAR(20),@ENDTIME VARCHAR(20)
SET @BEGINTIME=‘2025-04-27’
SET @ENDTIME=‘2025-09-1’;

IF(CONVERT(DATETIME,@ENDTIME)=CONVERT(DATETIME,CONVERT(VARCHAR(10),GETDATE())))
BEGIN
SET @ENDTIME=(SELECT CONVERT(VARCHAR(10),DATEADD(D,-1,TRY_CAST(@ENDTIME AS DATETIME)),23))
END

DECLARE @ENDTIME1 VARCHAR(10),@DATEIFF_M INT
SET @ENDTIME1=(SELECT CONVERT(VARCHAR(10),DATEADD(D,1,TRY_CAST(@ENDTIME AS DATETIME)),23))/结束日期+1天/
SET @DATEIFF_M=DATEDIFF(DAY,@BEGINTIME,@ENDTIME1)/30;/日期区间月份/

IF(OBJECT_ID(‘tempdb…#LastDayOfMonth’) IS NOT NULL)
BEGIN
DROP TABLE #LastDayOfMonth
END
CREATE TABLE #LastDayOfMonth(CMonth VARCHAR(10))
DECLARE @BEGINTIME1 DATETIME,@i INT
SET @BEGINTIME1=@BEGINTIME

SET @i=0
IF(@DATEIFF_M>0)
BEGIN
WHILE(@i<@DATEIFF_M)
BEGIN
IF(NOT EXISTS(SELECT * FROM #LastDayOfMonth))
BEGIN
INSERT INTO #LastDayOfMonth(CMonth)VALUES(CONVERT(VARCHAR(10),CONVERT(DATETIME,@BEGINTIME),112))
END
ELSE
BEGIN
INSERT INTO #LastDayOfMonth(CMonth)VALUES(CONVERT(VARCHAR(10), EOMONTH(DATEADD(DAY,@i*30,EOMONTH(@BEGINTIME))),112))
SET @i=@i+1
END
END
END
INSERT INTO #LastDayOfMonth(CMonth)VALUES(CONVERT(VARCHAR(10),CONVERT(DATETIME,@ENDTIME),112))

SELECT * FROM #LastDayOfMonth
IF(OBJECT_ID(‘tempdb…#tab0’) IS NOT NULL)
BEGIN
DROP TABLE #tab0
END

SELECT t0.F_BHR_MATERIALID FMATERIALID
,t1.FNUMBER FMATERIALNUMBER,t0.F_BHR_DATE,t0.F_BHR_STOCKID,t0.F_BHR_STOCKORGID
, t0.F_BHR_StockQty FQTY
INTO #tab0
FROM BHR_T_STK_HisInventory t0
JOIN T_BD_MATERIAL t1 ON t1.FMATERIALID=t0.F_BHR_MATERIALID
WHERE t0.F_BHR_DATE IN (SELECT * FROM #LastDayOfMonth)
AND t0.F_BHR_STOCKID IN(107673,1938233,107654,934634,1582878,2123102,3152742)

IF(OBJECT_ID(‘tempdb…#Mate_List’) IS NOT NULL)
BEGIN
DROP TABLE #Mate_List
END

IF(OBJECT_ID(‘tempdb…#tab1’) IS NOT NULL)
BEGIN
DROP TABLE #tab1
END

SELECT FMATERIALID,FMATERIALNUMBER,CONVERT(VARCHAR(10),F_BHR_DATE,112) F_BHR_DATE,F_BHR_STOCKID,F_BHR_STOCKORGID,FQTY INTO #tab1 FROM #tab0

DECLARE @sql1 NVARCHAR(MAX),@sql2 NVARCHAR(4000),@Cmonth NVARCHAR(30);
SELECT CMonth FROM #LastDayOfMonth

SELECT
@sql2=STUFF((SELECT ‘’,‘,[’ + t0.Cmonth+‘]’
FROM #LastDayOfMonth t0 FOR XML PATH(‘’)),1,1,‘’)
FROM #LastDayOfMonth t1
SET @sql1=‘SELECT * FROM ( SELECT FMATERIALID,FMATERIALNUMBER,F_BHR_STOCKID,F_BHR_STOCKORGID,F_BHR_DATE,FQTY FROM #tab1) p PIVOT(SUM(FQTY) FOR [F_BHR_DATE]IN (’+@sql2+‘) ) AS pvt ORDER BY pvt.FMATERIALNUMBER’
SELECT @sql1=@sql1
EXEC sp_executesql @sql1

http://www.dtcms.com/a/354342.html

相关文章:

  • 数据治理:AI健康血液的生命线
  • Elasticsearch数据迁移快照方案初探(一):多节点集群配置踩坑记
  • Anaconda的安装与使用
  • 文本分块的优化策略-语义完整性、控制长度、重叠切分、结合模型,考虑大模型输入限制
  • matlab的app中传递数据
  • 林墨2025全新个人EP《嘻嘻呵呵嘿嘿哈哈》 第三支单曲解锁
  • 【数据分享】安徽省安庆市地理基础数据(道路、水系、铁路、行政边界(含乡镇)、DEM等)
  • 企业分支上云的常见误区与纠正方案
  • LeetCode - 反转链表 / K 个一组翻转链表
  • HSA35NV001美光固态闪存NQ482NQ470
  • CT03-215.数组中第k大的元素
  • 面试之微服务架构
  • 美团面试手撕:手动实现开方函数math.sqrt(x)
  • Spring Security 深度学习(一): 基础入门与默认行为分析
  • 【Vue2 ✨】Vue2 入门之旅(一):初识 Vue2
  • 详细梳理 MyBatis-Plus 的 QueryWrapper 和 LambdaQueryWrapper的入门到精通
  • App中分发中的防盗链开发是做什么的?防盗链有什么作用?什么是防盗链?
  • vscode 如何调试 python 2.7
  • 【PyTorch】基于YOLO的多目标检测项目(一)
  • 免费开源图片压缩工具|绿色版本地运行,支持批量压缩+格式转换,不上传数据,隐私安全有保障!
  • 解决delphi label 在timer下闪烁的问题
  • 字节面试手撕题:神经网络模型损失函数与梯度推导
  • CSS(面试)
  • Mojomox-在线 AI logo 设计工具
  • 从“流量焦虑”到“稳定增长”:用内容平衡术解锁Adsense变现新密码
  • 电子器械如何统一管理系统权限?一场IT治理的“攻坚战”
  • 第二十九天:重载、重写和覆盖
  • 【网络】iptables MASQUERADE作用
  • 机器学习与Backtrader结合量化交易
  • 无人机抗干扰技术要点解析