SQL 获取一段时间内每半小时中最大时间的一条数据,高手进!

fk1984316 2016-05-31 04:18:15
我想生成这样的数据
从2016年5月18日早上8点5分开时为一条数据,然后每隔半个小时为一条数据,一直生成直至2016年5月20日下午8时50分,结果应该象这样:
2016年5月18日08:05
2016年5月18日08:35
2016年5月18日09:05
2016年5月18日09:35
......................
2016年5月20日20:50

如果每半小时的整点没有数据,则获取小于该时间最大的一条时间数据,例如:
2016年5月18日08:35:00 没有数据,可能 8:05--8:35 这一时间段内最大的一条时间数据是 8:33:50,就这样一直轮循,
一直到最后的截止时间,如果结束时间不到半小时,就取结束时间的那条数据,
例如:结束时间是 2016/05/20 20:50:00,不到半小时就取这个时间数据,
求大神指教这个存储过程怎么写!
...全文
871 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
fk1984316 2016-05-31
  • 打赏
  • 举报
回复
引用 8 楼 spiritofdragon 的回复:
--测试数据为18号到20号全天
;WITH t AS (
	SELECT * FROM master.dbo.spt_values WHERE type='P'
)
SELECT ROW_NUMBER()OVER(ORDER BY GETDATE()) ID,DATEADD(n,t.number*10+CHECKSUM(NEWID())%5,'2016-05-18 00:05:00') RecordTime--,CHECKSUM( NEWID())%5 
	INTO #t
FROM t 
WHERE DATEADD(n,t.number*10,'2016-05-18')<'2016-05-21';

--查询
DECLARE @beginTime DATETIME='2016-05-18 08:05:00';
DECLARE @endTime DATETIME='2016-05-20 20:50:00';
;WITH t AS (
	SELECT * FROM master.dbo.spt_values WHERE type='P'
)
,tt AS (
	SELECT DATEADD(n,t.number*30,@beginTime) StandardTime ,number
	FROM t 
	WHERE DATEADD(n,t.number*30,@beginTime)<DATEADD(n,30,@endTime)
)
SELECT tt.StandardTime,MAX(#t.RecordTime) RecordTime
FROM tt JOIN #t ON #t.RecordTime>DATEADD(n,-30,tt.StandardTime) AND #t.RecordTime<=tt.StandardTime
WHERE RecordTime>DATEADD(n,-30,@beginTime) AND RecordTime<=@endTime
GROUP BY tt.StandardTime
ORDER BY 1;
多谢大神!
spiritofdragon 2016-05-31
  • 打赏
  • 举报
回复
--测试数据为18号到20号全天
;WITH t AS (
	SELECT * FROM master.dbo.spt_values WHERE type='P'
)
SELECT ROW_NUMBER()OVER(ORDER BY GETDATE()) ID,DATEADD(n,t.number*10+CHECKSUM(NEWID())%5,'2016-05-18 00:05:00') RecordTime--,CHECKSUM( NEWID())%5 
	INTO #t
FROM t 
WHERE DATEADD(n,t.number*10,'2016-05-18')<'2016-05-21';

--查询
DECLARE @beginTime DATETIME='2016-05-18 08:05:00';
DECLARE @endTime DATETIME='2016-05-20 20:50:00';
;WITH t AS (
	SELECT * FROM master.dbo.spt_values WHERE type='P'
)
,tt AS (
	SELECT DATEADD(n,t.number*30,@beginTime) StandardTime ,number
	FROM t 
	WHERE DATEADD(n,t.number*30,@beginTime)<DATEADD(n,30,@endTime)
)
SELECT tt.StandardTime,MAX(#t.RecordTime) RecordTime
FROM tt JOIN #t ON #t.RecordTime>DATEADD(n,-30,tt.StandardTime) AND #t.RecordTime<=tt.StandardTime
WHERE RecordTime>DATEADD(n,-30,@beginTime) AND RecordTime<=@endTime
GROUP BY tt.StandardTime
ORDER BY 1;
AcHerat 2016-05-31
  • 打赏
  • 举报
回复

declare @beg_date datetime
declare @end_date datetime
set @beg_date = '2016-05-18 08:05:00'  --起始时间点
set @end_date = '2016-05-20 08:50:00'  --截止时间点

select DATEADD(MI,30*number,@beg_date) as date_value
from master..spt_values t
where type = 'P'
  and number between 0 and DATEDIFF(MI,@beg_date,@end_date)/30
fk1984316 2016-05-31
  • 打赏
  • 举报
回复
引用 5 楼 roy_88 的回复:
生成日期 ?
;WITH Dt
AS
(
SELECT CAST('2016-05-18 08:05' AS DATETIME) AS Col
UNION ALL
SELECT CASE WHEN Col+'00:30'>='2016-05-20 20:50' THEN '2016-05-20 20:50' ELSE Col+'00:30' END  FROM Dt WHERE Col<'2016-05-20 20:50'
)
SELECT * FROM Dt OPTION(MAXRECURSION 0)
不只日期的,还有编号,值字段也需要取出来的,但时间不像版主这样的,半小时那个时间没有数据,就取这半小时中最大的那条时间数据
中国风 2016-05-31
  • 打赏
  • 举报
回复
生成日期 ?
;WITH Dt
AS
(
SELECT CAST('2016-05-18 08:05' AS DATETIME) AS Col
UNION ALL
SELECT CASE WHEN Col+'00:30'>='2016-05-20 20:50' THEN '2016-05-20 20:50' ELSE Col+'00:30' END  FROM Dt WHERE Col<'2016-05-20 20:50'
)
SELECT * FROM Dt OPTION(MAXRECURSION 0)
fk1984316 2016-05-31
  • 打赏
  • 举报
回复
有没有高手帮忙看看怎么写啊!
fk1984316 2016-05-31
  • 打赏
  • 举报
回复
引用 1 楼 spiritofdragon 的回复:
你是想插入数据,还是查询数据?又生成又获取,不懂。
就是查询一个时间段内每半小时数据,半小时的时间段内,获取最大的一条时间数据
fk1984316 2016-05-31
  • 打赏
  • 举报
回复
引用 1 楼 spiritofdragon 的回复:
你是想插入数据,还是查询数据?又生成又获取,不懂。
从数据库中按规则获取数据
spiritofdragon 2016-05-31
  • 打赏
  • 举报
回复
你是想插入数据,还是查询数据?又生成又获取,不懂。

22,209

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧