SQL查询案例:寻找连续日期中残缺的数据

摘要:
实现第一步,创建日期序列暂时用1-10来存储日期的变化。最后与主表关联的时候,再作日期的处理。

测试表与测试数据

CREATE TABLE TestDataCheck (

idvarchar(5),--设备ID

dates datetime--日期

)

INSERT INTO TestDataCheck VALUES ('设备1', '2010-10-01 00:00:00');

INSERT INTO TestDataCheck VALUES ('设备1', '2010-10-02 00:00:00');

INSERT INTO TestDataCheck VALUES ('设备1', '2010-10-03 00:00:00');

INSERT INTO TestDataCheck VALUES ('设备1', '2010-10-04 00:00:00');

INSERT INTO TestDataCheck VALUES ('设备1', '2010-10-06 00:00:00');

INSERT INTO TestDataCheck VALUES ('设备1', '2010-10-07 00:00:00');

INSERT INTO TestDataCheck VALUES ('设备1', '2010-10-08 00:00:00');

INSERT INTO TestDataCheck VALUES ('设备1', '2010-10-09 00:00:00');

INSERT INTO TestDataCheck VALUES ('设备2', '2010-10-01 00:00:00');

INSERT INTO TestDataCheck VALUES ('设备2', '2010-10-02 00:00:00');

INSERT INTO TestDataCheck VALUES ('设备2', '2010-10-03 00:00:00');

INSERT INTO TestDataCheck VALUES ('设备2', '2010-10-07 00:00:00');

INSERT INTO TestDataCheck VALUES ('设备2', '2010-10-08 00:00:00');

INSERT INTO TestDataCheck VALUES ('设备2', '2010-10-09 00:00:00');

INSERT INTO TestDataCheck VALUES ('设备2', '2010-10-10 00:00:00');

要求

取得所有设备,在2010-10-01至2010-10-10之间,缺少的记录

思路

首先需要一个10天的日期序列

然后,需要一个10天与设备的排列组合

最后,用排列组合与目标表关联检索缺少的数据。

实现

第一步,创建日期序列

暂时用1-10来存储日期的变化。最后与主表关联的时候,再作日期的处理。

SELECT TOP 10

ROW_NUMBER() OVER (ORDER BY (SELECT 0) ) AS NO

FROM sys.tables

NO

--------------------

1

2

3

4

5

6

7

8

9

10

第二步,日期、设备排列组合

SELECT

all_id.id,

all_day_no.no

FROM

(

SELECT TOP 10

ROW_NUMBER() OVER (ORDER BY (SELECT 0) ) AS NO

FROM sys.tables

) AS all_day_no,

(

SELECT DISTINCT

id

FROM

TestDataCheck

) AS all_id

idno

----- --------------------

设备11

设备21

设备12

设备22

设备13

设备23

设备14

设备24

设备15

设备25

设备16

设备26

设备17

设备27

设备18

设备28

设备19

设备29

设备110

设备210

第三步排列组合与目标表关联

SELECT

CONVERT(DATETIME, '2010-09-30 00:00:00') + AllTestDataCheck.NO AS日期,

AllTestDataCheck.id

FROM

(

SELECT

all_id.id,

all_day_no.no

FROM

(

SELECT TOP 10

ROW_NUMBER() OVER (ORDER BY (SELECT 0) ) AS NO

FROM sys.tables

) AS all_day_no,

(

SELECT DISTINCT

id

FROM

TestDataCheck

) AS all_id

) AllTestDataCheck

LEFT JOIN TestDataCheck

ON (AllTestDataCheck.id = TestDataCheck.id

AND CONVERT(DATETIME, '2010-09-30 00:00:00') + AllTestDataCheck.NO = TestDataCheck.dates)

WHERE

TestDataCheck.dates IS NULL

执行结果

日期id

----------------------- -----

2010-10-04 00:00:00.000设备2

2010-10-05 00:00:00.000设备1

2010-10-05 00:00:00.000设备2

2010-10-06 00:00:00.000设备2

2010-10-10 00:00:00.000设备1

免责声明:文章转载自《SQL查询案例:寻找连续日期中残缺的数据》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇STM32学习笔记——AFIO时钟的配置问题gitlab Runner 安装与部署下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

使用layui框架的select获取选中的值

在使用时需要注意:select标签的外层需要加上类名".layui-form" 接下来就是根据需求来改变下拉框的内容了,直接给select的option重新赋一次值,记得加上对应的value属性。这里要和layui.js动态加上的dd标签的lay-value属性一致 重点来了!!!如何获取下拉框选中的值呢?图又来了 当然也可以,通过option的va...

Sqlserver 利用时间戳 + 自增长ID 生成流水号 模拟并发请求生成重复ID 解决方法

1. 事件起因: 当在sqlserver 中利用 时间戳(22010110) + 请求终端ID (1001) + 四位流水号(开始0001) ; 四位流水号算法创建表TZD_LSH ;其中id是 自增长 ;系数1 insert into TZD_LSH (Hoisd) select @hospcode select newid = m...

十、oracle 常用函数

一、字符函数字符函数是oracle中最常用的函数,我们来看看有哪些字符函数:lower(char):将字符串转化为小写的格式。upper(char):将字符串转化为大写的格式。length(char):返回字符串的长度。substr(char, m, n):截取字符串的子串,n代表取n个字符的意思,不是代表取到第n个replace(char1, sear...

sqlserver-查阻塞

模拟阻塞: 打开两个窗口: 窗口一: 1 BEGIN TRANSACTION--开始事务 2 update tblUser set [Password] = '00000' where id = 1 3 --等待1分钟 4 WAITFOR DELAY '00:1'; 窗口二: 1 select * from tblUser where id =...

[转]Oracle存储过程给变量赋值的方法

原文地址:http://blog.csdn.net/drbing/article/details/51821262 截止到目前我发现有三种方法可以在存储过程中给变量进行赋值:1、直接法     :=       如:v_flag := 0;2、select into   如:假设变量名为v_flag,select count(*) into v_flag...

Mysql中文检索匹配与正则

今天在用sql模糊查询包含字母d的时候,发现一些不包含此字母的也被查询出来了: SELECT * FROM custom WHERE custom_realname LIKE '%d%' 查询了一下,发现以下说明: (最后修改为: SELECT * FROM custom WHERE custom_realname LIKE BINARY '%d%...