Chi*_*kar 0 sql-server date count
我正在使用 SQL Server 2008 R2,我有一张表:
tbl_calls
cl_Id
cl_StartDate
cl_endDate
Run Code Online (Sandbox Code Playgroud)
我传递两个参数@StartDate并@EndDate给我的存储过程。
我的要求是在每 15 分钟的持续时间内获取记录数
例子:
@StartDate = '2015-11-16 00:00:00.000',
@EndDate = '2015-11-16 23:59:00.000'
Run Code Online (Sandbox Code Playgroud)
输出应该是:
Date Count
2015-11-16 00:00:00.000 10(Count of startDate between '2015-11-16 00:00:00.000' AND '2015-11-16 00:15:00.000')
2015-11-16 00:15:00.000 7(Count of startDate between '2015-11-16 00:15:00.000' AND '2015-11-16 00:30:00.000')
2015-11-16 00:30:00.000 50(Count of startDate between '2015-11-16 00:30:00.000' AND '2015-11-16 00:45:00.000')
upto @EndDate
Run Code Online (Sandbox Code Playgroud)
我试图这样做但没有得到想法,我不确定下面的查询是否接近逻辑。
我试过的是:
DECLARE @StartDate DATETIME = DATEADD(DAY,-1,GETUTCDATE()),
@EndDate DATETIME = GETUTCDATE()
SELECT New
FROM
(SELECT
(CASE
WHEN cl_StartTime BETWEEN @StartDate AND DATEADD(MINUTE, 15, @StartDate)
THEN 1
ELSE 0
END) AS New
FROM
tbl_Calls WITH (NOLOCK)
WHERE
cl_StartTime BETWEEN @StartDate AND @EndDate) AS Inners
GROUP BY
New
Run Code Online (Sandbox Code Playgroud)
如果您需要更多详细信息,请告诉我。
谢谢你。
首先,你需要生成全部15分钟的间隔从开始@StartDate到@EndDate。您可以在Tally Table的帮助下完成此操作。然后做一个LEFT JOINontbl_calls来统计调用次数:
DECLARE @StartDate DATETIME = '2015-11-16 00:00:00.000',
@EndDate DATETIME = '2015-11-16 23:59:00.000'
DECLARE @nRows INT
SELECT @nRows = DATEDIFF(MINUTE, @StartDate, DATEADD(DAY, 1, CAST(@EndDate AS DATE))) / 15
;WITH E1(N) AS(
SELECT 1 FROM(VALUES (1),(1),(1),(1),(1),(1),(1),(1),(1),(1)) t(N)
),
E2(N) AS(SELECT 1 FROM E1 a CROSS JOIN E1 b),
E4(N) AS(SELECT 1 FROM E2 a CROSS JOIN E2 b),
E8(N) AS(SELECT 1 FROM E4 a CROSS JOIN E4 b),
Tally(N) AS(
SELECT TOP(@nRows)
ROW_NUMBER() OVER(ORDER BY (SELECT NULL))
FROM E8
),
Intervals(sd, ed) AS(
SELECT
DATEADD(MINUTE, (t.N - 1) * 15, @StartDate),
DATEADD(MINUTE, N * 15, @StartDate)
FROM Tally t
)
SELECT
i.sd, i.ed, cnt = COUNT(c.cl_Id)
FROM Intervals i
LEFT JOIN tbl_calls c
ON i.sd <= c.cl_EndDate
AND i.ed > c.cl_Startdate
GROUP BY i.sd, i.ed
Run Code Online (Sandbox Code Playgroud)
请注意,这里生成的间隔是从+ 1 天@StartDate的开始@EndDate,意思是从'2015-11-16 00:00:00.000'到'2015-11-17 00:00:00.000'。
此外,JOIN条件指定呼叫持续时间必须介于间隔开始和间隔结束之间,但间隔结束不得与呼叫持续时间重叠。您可以查看此答案以获取更多解释。
您可以JOIN根据自己的喜好修改条件,但这基本上是要点。
| 归档时间: |
|
| 查看次数: |
2328 次 |
| 最近记录: |