Sqlserver 推算( 日,周,月,季度,年统计)

本文介绍了一种使用SQL来获取指定日期的年、季度、月、周等不同维度的第一天和最后一天的方法。通过这些SQL语句,可以方便地进行日期范围的计算,适用于多种应用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

DECLARE @dt datetime
SET @dt=GETDATE()
DECLARE @number int
SET @number=1

--1.指定日期该年的第一天或最后一天
--第一天为月日、最后一天为月日都是固定的
		--A. 年的第一天
		SELECT CONVERT(char(5),@dt,120)+'1-1'AS '年第一天'
		--B. 年的最后一天
		SELECT CONVERT(char(5),@dt,120)+'12-31'AS '年最后一天'

--2.指定日期所在季度的第一天或最后一天
			--A. 季度的第一天
			SELECT CONVERT(datetime,
			 CONVERT(char(8),
			  DATEADD(Month,
			   DATEPART(Quarter,@dt)*3-Month(@dt)-2,
			   @dt),
			  120)+'1') AS '季度第一天'
			--B. 季度的最后一天(CASE判断法)
			SELECT CONVERT(datetime,
			 CONVERT(char(8),
			  DATEADD(Month,
			   DATEPART(Quarter,@dt)*3-Month(@dt),
			   @dt),
			  120)
			 +CASE WHEN DATEPART(Quarter,@dt) in(1,4)
			  THEN '31'ELSE '30' END) AS  '季度最后一天'
			--C. 季度的最后一天(直接推算法)
			SELECT DATEADD(Day,-1,
			 CONVERT(char(8),
			  DATEADD(Month,
			   1+DATEPART(Quarter,@dt)*3-Month(@dt),
			   @dt),
			  120)+'1') AS '季度最后一天'

--3.指定日期所在月份的第一天或最后一天
		--A. 月的第一天
		SELECT CONVERT(datetime,CONVERT(char(8),@dt,120)+'1')AS '月第一天'
		--B. 月的最后一天
		SELECT DATEADD(Day,-1,CONVERT(char(8),DATEADD(Month,1,@dt),120)+'1')AS '月最后一天'

--4.指定日期所在周的任意一天
SELECT DATEADD(Day,@number-DATEPART(Weekday,@dt),@dt)

--5.指定日期所在周的任意星期几
		--A.  星期天做为一周的第天
		SELECT DATEADD(Day,@number-(DATEPART(Weekday,@dt)+@@DATEFIRST-1)%7,@dt) 
		--B.  星期一做为一周的第天
		SELECT DATEADD(Day,@number-(DATEPART(Weekday,@dt)+@@DATEFIRST-2)%7-1,@dt)
		 









转载于:https://www.cnblogs.com/sunjinpeng/archive/2012/03/15/2397999.html

SELECT a.生产线, a.工单号, b.工序, a.设备编号, a.点检项目, a.内容与方法, a.基准值, a.定期时长, a.单位, CONVERT(DATE, a.下次点检) AS 下次点检期, a.类型区分, a.频率, COALESCE(point_count.点检次数, 0)+ COALESCE(tpm_count.TPM次数, 0) AS 次数,case when 单位='天' then 定期时长 when 单位='' then 定期时长*30 end 期 FROM ( SELECT 生产线, 工单号, 设备编号, 点检项目, 内容与方法, 基准值, 定期时长, 单位, 下次点检期, 类型区分, CASE WHEN 单位 = '' THEN FLOOR(12 / 定期时长) WHEN 单位 = '天' THEN FLOOR(365 / 定期时长) ELSE NULL END AS 频率 FROM [dbo].[dwd_设备_定期台账一览] b1 WHERE 工单号 like '%${工单号}%' and 作业部门 = '现场' AND YEAR(下次点检) >= 2025 AND 台账状态 = '启用' AND 生产线 IN ('缸体_TNGA1线', '缸体_TNGA2线') ) AS a LEFT JOIN ( SELECT DISTINCT op AS 工序, mc_no AS 设备编号 FROM 现场DB.dbo.T_fault_tag_edit ) AS b ON a.设备编号 = b.设备编号 LEFT JOIN ( SELECT 关联工单 AS 工单号, COUNT(*) AS 点检次数 FROM [dbo].[dwd_设备_点检单一览] WHERE 实施部门 = '现场' AND YEAR(预计点检) = 2025 AND 实际完成期 IS NOT NULL AND 作业状态 = '已完成' AND 生产线 IN ('缸体_TNGA1线', '缸体_TNGA2线') GROUP BY 关联工单 ) AS point_count ON a.工单号 = point_count.工单号 LEFT JOIN ( SELECT 台账号, COUNT(*) AS TPM次数 FROM [dbo].[dwd_TPM实施] WHERE 作业状态 = '已完成' AND 生产线 IN ('缸体_TNGA1线', '缸体_TNGA2线') GROUP BY 台账号 ) AS tpm_count ON a.工单号 = tpm_count.台账号 ORDER BY a.下次点检期 ASC 需求:下一次点检期+定期时长*单位=下一次点检期,按次数汇总未来的度点检计划
最新发布
08-01
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值