我需要生成如下记录:
我有一个表tbl_Graph
,其中包含DBName, Size, JobName, StartDate, Enddate
列。
---------------------------------------------------------------------------
DBName | Size | JobName | StartTime | EndTime |
--------------------------------------------------------------------------|
DB1 | 13.8 | JOB1 | 4/7/2013 20:44 | 4/7/2013 21:05|
DB2 | 10.5 | JOB2 | 4/7/2013 18:20 | 4/7/2013 19:09|
DB3 | 09.10 | JOB4 | 4/7/2013 3:04 | 4/7/2013 3:23 |
DB4 | 13.8 | JOB5 | 4/7/2013 11:49 | 4/7/2013 11:54|
DB5 | 10.5 | JOB3 | 4/7/2013 16:04 | 4/7/2013 16:30|
DB6 | 09.10 | JOB6 | 4/7/2013 14:02 | 4/7/2013 14:04|
DB7 | 13.8 | JOB7 | 4/7/2013 20:05 | 4/7/2013 21:21|
DB8 | 10.5 | JOB8 | 4/7/2013 19:03 | 4/7/2013 19:17|
DB9 | 09.10 | JOB9 | 4/7/2013 0:17 | 4/7/2013 11:07|
DB10 | 13.8 | JOB11 | 4/7/2013 1:05 | 4/7/2013 1:40 |
---------------------------------------------------------------------------
如果我指定日期为'4/7/2013',那么它将根据此日期获取所有匹配的记录,并且它应该根据每行的开始和结束时间每分钟生成一次记录。
我需要像这样的结果集
---------------------------------
Date | JobName |
---------------------------------
4/7/2013 20:44 | JOB1 |
4/7/2013 20:45 | JOB1 |
4/7/2013 20:46 | JOB1 |
4/7/2013 20:47 | JOB1 |
4/7/2013 20:48 | JOB1 |
4/7/2013 20:49 | JOB1 |
4/7/2013 20:50 | JOB1 |
4/7/2013 20:51 | JOB1 |
4/7/2013 20:52 | JOB1 |
4/7/2013 20:53 | JOB1 |
4/7/2013 20:54 | JOB1 |
4/7/2013 20:55 | JOB1 |
4/7/2013 20:56 | JOB1 |
4/7/2013 20:57 | JOB1 |
4/7/2013 20:58 | JOB1 |
4/7/2013 20:59 | JOB1 |
4/7/2013 21:01 | JOB1 |
4/7/2013 21:02 | JOB1 |
4/7/2013 21:03 | JOB1 |
4/7/2013 21:04 | JOB1 |
4/7/2013 21:05 | JOB1 |
---------------------------------
如何在没有性能问题的情况下实现这一目标?
我试过的解决方案:
我通过使用游标和while循环实现了这一点,但它导致性能问题,比如花费超过60秒来获取记录。
答案 0 :(得分:2)
试试这个 -
<强>查询:强>
DECLARE @temp TABLE
(
JobName VARCHAR(10)
, StartTime DATETIME
, EndTime DATETIME
)
INSERT INTO @temp (JobName, StartTime, EndTime)
VALUES
('JOB1', '20130704 20:44', '20130704 21:05'),
('JOB2', '20130704 18:20', '20130704 19:09'),
('JOB4', '20130704 3:04 ', '20130704 3:23 '),
('JOB5', '20130704 11:49', '20130704 11:54'),
('JOB3', '20130704 16:04', '20130704 16:30'),
('JOB6', '20130704 14:02', '20130704 14:04'),
('JOB7', '20130704 20:05', '20130704 21:21'),
('JOB8', '20130704 19:03', '20130704 19:17'),
('JOB9', '20130704 0:17 ', '20130704 11:07'),
('JOB11', '20130704 1:05 ', '20130704 1:40 ')
SELECT
JobName
, DateCol = DATEADD(MINUTE, sv.number, StartTime)
FROM (
SELECT
StartTime
, diff = DATEDIFF(MINUTE, StartTime, EndTime)
, JobName
FROM @temp
) t
JOIN [master].dbo.spt_values sv ON sv.number <= diff
WHERE sv.[type] = 'p'
<强>输出:强>
JobName DateCol
---------- -----------------------
JOB1 2013-07-04 20:44:00.000
JOB1 2013-07-04 20:45:00.000
JOB1 2013-07-04 20:46:00.000
JOB1 2013-07-04 20:47:00.000
JOB1 2013-07-04 20:48:00.000
JOB1 2013-07-04 20:49:00.000
JOB1 2013-07-04 20:50:00.000
JOB1 2013-07-04 20:51:00.000
JOB1 2013-07-04 20:52:00.000
JOB1 2013-07-04 20:53:00.000
JOB1 2013-07-04 20:54:00.000
JOB1 2013-07-04 20:55:00.000
JOB1 2013-07-04 20:56:00.000
JOB1 2013-07-04 20:57:00.000
JOB1 2013-07-04 20:58:00.000
JOB1 2013-07-04 20:59:00.000
JOB1 2013-07-04 21:00:00.000
JOB1 2013-07-04 21:01:00.000
JOB1 2013-07-04 21:02:00.000
JOB1 2013-07-04 21:03:00.000
JOB1 2013-07-04 21:04:00.000
JOB1 2013-07-04 21:05:00.000
...