22,209
社区成员
发帖
与我相关
我的任务
分享
SELECT * FROM demo WHERE RecordDate >= DATEADD(hh,-1,GETDATE())
AND RecordDate <= GETDATE()
AND per <= 0.99
SELECT *
FROM demo
WHERE RecordDate >= '2015-06-19 09:00'
AND RecordDate < '2015-06-19 10:00'
AND per <= 0.99
WITH /* 测试数据 demo(RecordDate,per) AS (
SELECT '2015-06-19 08:32:07.000',0.89412915851272 UNION ALL
SELECT '2015-06-19 08:32:08.000',0.89412915851272 UNION ALL
SELECT '2015-06-19 09:30:58.000',0.890215264187867 UNION ALL
SELECT '2015-06-19 09:31:32.000',0.89412915851272 UNION ALL
SELECT '2015-06-19 09:32:07.000',0.99412915851272 UNION ALL
SELECT '2015-06-19 10:29:10.000',0.892172211350294 UNION ALL
SELECT '2015-06-19 10:32:07.000',0.892172211350294
), */
t AS ( -- 挑出有异常数据的时间,两端扩大1小时内为过滤区间
SELECT CONVERT(datetime,null) RecordDate,
CONVERT(datetime,null) limit1,
CONVERT(datetime,'2015-06-19 07:59:59',120) limit2,
0 rn
UNION ALL
SELECT RecordDate,
DATEADD(second,-3599,RecordDate) limit1,
DATEADD(second,3599,RecordDate) limit2,
ROW_NUMBER() OVER(ORDER BY RecordDate) rn
FROM demo
WHERE RecordDate >= '2015-06-19 08:00'
AND RecordDate < '2015-06-19 20:00'
AND per > 0.99
)
,s AS ( -- 挑出过滤范围之外的区间
SELECT t1.rn,
t1.limit2 startDate,
ISNULL(t2.limit1, CONVERT(datetime,'2015-06-19 20:00',120)) endDate
FROM t t1
LEFT JOIN t t2
ON t1.rn + 1 = t2.rn
WHERE t1.limit2 < ISNULL(t2.limit1, CONVERT(datetime,'2015-06-19 20:00',120))
)
--SELECT * FROM s
SELECT demo.*
FROM s
JOIN demo
ON demo.RecordDate > s.startDate
AND demo.RecordDate < s.endDate
RecordDate per
----------------------- --------------------
2015-06-19 08:32:07.000 0.894129158512720
2015-06-19 10:32:07.000 0.892172211350294