sql语句之根据起始结束日期获取每一天、周、月、年

在统计报表中,常需输入起始和结束日期按不同时间单位查询数据,表数据按天存储时,可通过sql函数或存储过程实现。文中介绍了根据日期范围获取每一天、每周、每月、每年结果集的方法,还希望得到更好建议。

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

背景:很多的统计报表中需要输入起始,结束日期来按照不同的时间单位查询数据,而且显示出来的列名是你的动态时间单位。你的表数据是按天存的日期,那么这时候你可能要做一些sql函数或者存储过程来实现了。

1.根据起始和结束日期来获取范围中的每一天,作为结果集返回(函数)

create function [dbo].[fn_GetDateRange](@DATE_START datetime, @DATE_END datetime)
RETURNS TABLE
AS
RETURN
(
SELECT convert(char(10), DATEADD(dd, number, @DATE_START),120) AS DATA_DATE 
FROM    master.dbo.spt_values  as spt
WHERE   type = 'p' AND number <= DATEDIFF(DAY, @DATE_START, @DATE_END)
)

GO
select * from  fn_GetDateRange('2018-07-31','2018-08-10')

结果展示:

2.根据起始和结束日期来获取范围中的每周(包括当周起始和结束日期),作为结果集返回(存储过程)

CREATE PROCEDURE [dbo].[GetWeekRange]
@tmpDate datetime, @DATE_END datetime
AS
BEGIN
	SET DATEFIRST 1
   DECLARE @index INT
   DECLARE @table TABLE
    (
      WeekTimes INT ,
      FirstDay datetime ,
      EndDay datetime
    )
   DECLARE @YearFistWK INT
   SET @YearFistWK= DATEPART(dw, @tmpDate)
   SET @index = ( SELECT   DATEPART(WEEK, @tmpDate))
   IF ( @YearFistWK = 7 )
    BEGIN 
        SET @index = @index + 1
    END
WHILE @tmpDate <= @DATE_END
    BEGIN
        INSERT  INTO @table
                SELECT  @index ,
                        a.FirstDay ,
                        b.EndDay
                FROM    ( SELECT    1 AS ID ,
                                    DATEADD(wk, DATEDIFF(wk, 0, @tmpDate), 0) AS FirstDAy
                        ) a
                        LEFT JOIN ( SELECT  1 AS ID ,
                                            DATEADD(wk,
                                                    DATEDIFF(wk, 0, @tmpDate),
                                                    6) AS EndDay
                                  ) b ON a.ID = b.ID
 
        SET @tmpDate = DATEADD(DAY, 7, @tmpDate)
        SET @index = @index + 1
		END
		SELECT  WeekTimes, CONVERT(varchar(100), FirstDay, 23) FirstDay,CONVERT(varchar(100), EndDay, 23) EndDay
FROM    @table
END

GO

exec GetWeekRange '2018-07-31','2018-08-10'

结果展示:

3.根据起始和结束日期来获取范围中的每月,作为结果集返回(存储过程)

CREATE PROCEDURE [dbo].[GetMonthRange] 
@tmpDate datetime, @DATE_END datetime
AS
BEGIN
	DECLARE @table TABLE
    (
	  DateMonth datetime
	)
	WHILE @tmpDate <= @DATE_END
	BEGIN
        INSERT  INTO @table
                SELECT  DATEADD(mm, DATEDIFF(mm, 0, @tmpDate), 0) AS DateMonth
                      
        SET @tmpDate = CONVERT(varchar(7), DATEADD(mm, 1, @tmpDate) , 120) + '-01'
		END
		select CONVERT(varchar(7), DateMonth, 23) DateMonth  from @table
END

GO
exec GetMonthRange '2018-07-31','2018-08-10'

结果展示:

4.根据起始和结束日期来获取范围中的每年,作为结果集返回(存储过程)

CREATE PROCEDURE [dbo].[GetYearRange] 
@tmpDate datetime, @DATE_END datetime
AS
BEGIN
DECLARE @table TABLE
    (
	  DateYear datetime
	)
	WHILE @tmpDate <= @DATE_END
	BEGIN
        INSERT  INTO @table
                SELECT  DATEADD(yy, DATEDIFF(yy, 0, @tmpDate), 0) AS DateYear
                      
        SET @tmpDate = CONVERT(varchar(4), DATEADD(yy, 1, @tmpDate) , 120) + '-01-01'
		END
		select CONVERT(varchar(4), DateYear, 23) DateYear  from @table
END

GO
exec GetYearRange '2017-08-31','2018-08-10'

结果展示:

 

应该还要好的方法。望各位大佬不吝赐教

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值