SQL 输出某一天所在的年月对应的所有星期的开始与结束日期(每个月仅算4周,第四周可能会有10天)

本文介绍了一个SQL Server存储过程,用于动态计算指定月份每周的起始与结束日期,并特别处理了二月的特殊情况。该过程能够适应不同月份天数的变化,为报表生成提供便利。

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

背景:有时侯导报表需要动态计算每个月对应每周的第一天与最后一天。最后一周的时间要求不需要仅精确到第7天,可以算10天。


USE [***]
GO

/****** Object:  StoredProcedure [dbo].[sp_CalcStartDateEndDateForSingleYearMonthInDate]    Script Date: 2016/2/25 14:28:26 ******/
DROP PROCEDURE [dbo].[sp_CalcStartDateEndDateForSingleYearMonthInDate]
GO

/****** Object:  StoredProcedure [dbo].[sp_CalcStartDateEndDateForSingleYearMonthInDate]    Script Date: 2016/2/25 14:28:26 ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO







/*
	
	exec [sp_CalcStartDateEndDateForSingleYearMonthInDate] '2016-1-1'
	exec [sp_CalcStartDateEndDateForSingleYearMonthInDate] '2015-10-1'
	exec [sp_CalcStartDateEndDateForSingleYearMonthInDate] '2015-9-1'
	exec [sp_CalcStartDateEndDateForSingleYearMonthInDate] '2014-3-1'

*/

CREATE PROC [dbo].[sp_CalcStartDateEndDateForSingleYearMonthInDate](
	@SingleDate datetime
)
AS
BEGIN
   
	    
	DECLARE @month VARCHAR(2)
	DECLARE @year VARCHAR(4)

	DECLARE @FirstDayInFeb DATETIME
	DECLARE @LastDayInFeb DATETIME

	if(@SingleDate is null)
		set @SingleDate=getdate()

	SET @month= MONTH(@SingleDate)
	SET @year=YEAR(@SingleDate)

	SET @FirstDayInFeb = CONVERT(DATETIME, @year+'-02-01')
	SET @LastDayInFeb = DATEADD(M, 1, @FirstDayInFeb)
	SET @LastDayInFeb = DATEADD(D, -1, @LastDayInFeb)


	--drop table @tWeek

	--CREATE TABLE @tWeek
	--(
	--startDate VARCHAR(10),
	--endDate VARCHAR(10),
	--weekIndex INT
	--)

	declare  @tWeek TABLE
	 (
		startDate VARCHAR(10),
		endDate VARCHAR(10),
		weekIndex INT
	)

	INSERT INTO @tWeek VALUES  ( @year+'-'+@month+'-1',@year+'-'+@month+'-7', 1)
	INSERT INTO @tWeek VALUES  ( @year+'-'+@month+'-8',@year+'-'+@month+'-14', 2)
	INSERT INTO @tWeek VALUES  ( @year+'-'+@month+'-15',@year+'-'+@month+'-21', 3)

	IF @month IN (1,3,5,7,8,10,12)

		INSERT INTO @tWeek VALUES  ( @year+'-'+@month+'-22',@year+'-'+@month+'-31', 4)

	IF @month IN (4,6,9,11)

		INSERT INTO @tWeek VALUES  ( @year+'-'+@month+'-22',@year+'-'+@month+'-30', 4)

	IF @month=2

		INSERT INTO @tWeek VALUES  (  @year+'-'+@month+'-22',  CONVERT(VARCHAR(10),@LastDayInFeb,120),4)


	SELECT * FROM @tWeek


  
END
 







GO


运行结果:


在数据分析中,对时间序列的数据进行分析是一个常见的需求。例如,如果你需要计在一个中每活跃的用户数量,你可以使用`DATE_FORMAT()`和`COUNT()`函数结合来实现。首先,你需要一个包含用户ID和登录时间的表。假设表名为`user_logins`,其中`user_id`是用户ID,`login_time`是记录用户登录时间的字段。 参考资源链接:[MySQL日期时间函数详解](https://wenku.youkuaiyun.com/doc/6412b70ebe7fbd1778d48ed5?spm=1055.2569.3001.10343) 假设你想要计20234份每的活跃用户数量,你可以使用以下SQL查询: ```sql SELECT DATE_FORMAT(login_time, '%Y-%m-%d') AS day, COUNT(DISTINCT user_id) AS active_users FROM user_logins WHERE login_time BETWEEN '2023-04-01 00:00:00' AND '2023-04-30 23:59:59' GROUP BY day ORDER BY day; ``` 在这个查询中,`DATE_FORMAT(login_time, '%Y-%m-%d')`将`login_time`字段格式化为包含年月日的日期格式,`COUNT(DISTINCT user_id)`用于计有多少不同的用户登录,`BETWEEN`用于限定查询的日期范围,`GROUP BY`用于按分组结果,最后`ORDER BY`用于按日期排序。 如果你需要更复杂的时间段计,如用户在连续七内的活跃度,可以使用`WEEK()`和`YEAR()`函数结合子查询来实现。例如,要找出20234第一的所有活跃用户,可以使用以下查询: ```sql SELECT COUNT(DISTINCT user_id) AS active_users FROM user_logins WHERE YEAR(login_time) = 2023 AND WEEK(login_time) = WEEK('2023-04-01'); ``` 在这个查询中,`WEEK(login_time)`和`WEEK('2023-04-01')`用于提取和比较登录时间的数,从而确定是否在目标内。 以上只是时间序列分析的冰山一角,通过结合使用MySQL的各种日期和时间函数,你可以对数据进行各种复杂且深入的分析。如果希望深入学习更多关于MySQL日期和时间函数的使用和技巧,建议查阅《MySQL日期时间函数详解》。这本资料详细介绍了每个函数的用法,并提供了丰富的实例和场景应用,能帮助你在项目实战中更加熟练地运用这些工具进行数据分析。 参考资源链接:[MySQL日期时间函数详解](https://wenku.youkuaiyun.com/doc/6412b70ebe7fbd1778d48ed5?spm=1055.2569.3001.10343)
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值