SQL server 对日期每三天进行分组
有一个表,并不是每一个日期在里面都有对应的值,但是要根据日期对每三天的一个值进行求和,如果有一天在表里没有记录,则值当作0处理,问题的关键是怎么对日期进行每三天分组,并且...
有一个表,并不是每一个日期在里面都有对应的值,但是要根据日期对每三天的一个值进行求和,如果有一天在表里没有记录,则值当作0处理,问题的关键是怎么对日期进行每三天分组,并且即便那一天在表里没有记录…………求解
展开
2个回答
展开全部
1、首先需要一个能生成日期范围的表值函数
/*
生成一个日期范围,如2014.01、2014.02...
@Increment 步进值
@StartDate 开始日期
@EndDate 结束日期
----------------------
@SelectedRange 返回值名称(多语句表值函数的返回值必须存放在返回值变量中)
返回表的字段和类型:
iDate DATETIME,
iYear char(4),
iMonth char(2),
iYM CHAR(7)
*/
CREATE FUNCTION [dbo].[DateRange]
(
@Increment char(1) = 'm',
@StartDate DATE='20140101',
@EndDate DATE=null
)
RETURNS @SelectedRange TABLE
(
iDate DATE,
iYear char(4),
iMonth char(2),
iYM CHAR(7)
)
AS
BEGIN
/*Default value for stored procedures parameter have to be constants.
The function GETDATE() returns a different value from time to time, so it is not a constant expression.
*/
--IF @EndDate is null
--SET @EndDate = getdate()
--or
SET @EndDate=Coalesce(@EndDate,GetDate())
;WITH cteRange(DateRange) AS
(
SELECT CAST(@StartDate AS DATE)
UNION ALL
SELECT
CASE
WHEN @Increment = 'd' THEN DATEADD(dd, 1, DateRange)
WHEN @Increment = 'w' THEN DATEADD(ww, 1, DateRange)
WHEN @Increment = 'm' THEN DATEADD(mm, 1, DateRange)
END
FROM cteRange
WHERE DateRange <=
CASE
WHEN @Increment = 'd' THEN DATEADD(dd, -1, @EndDate)
WHEN @Increment = 'w' THEN DATEADD(ww, -1, @EndDate)
WHEN @Increment = 'm' THEN DATEADD(mm, -1, @EndDate)
END
)
INSERT INTO @SelectedRange(iDate,iYear,iMonth,iYM)
SELECT DateRange, YEAR(DateRange) [Year], MONTH(DateRange) [Month] ,CONVERT(VARCHAR(7),DateRange,102)[YM]
FROM cteRange
OPTION (MAXRECURSION 0);
RETURN
END
2、使用示例:
SELECT * FROM DateRange('d','2018-01-01','2018-06-01')
3、生成每隔3天的日期段
select
min(iMD)+'-'+max(iMD) as 时间段
,min(iDate) min_Date,max(iDate) max_Date
from [dbo].[DateRange]('d','2018-01-01','2018-06-01')
group by (id-1)/3
4、使用上面的查询去关联带值的表,然后进行SUM即可实现
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询