找出范围内丢失的数据

数据库环境 SQL SERVER2008R2

需求:有一个表的日期字段,存的是每天的日期,且该字段存在唯一性约束。由于管理员误操作,把当前月的一些日期给删了,

现在要把被删除的日期给找出来。

实现思路:创建一个日期辅助表,辅助表存的是当前月的所有日期,再和目标表左关联,日期对应不上的则是丢失的日期。

数据准备:

1.创建一个1-100的自然数列表

SELECT TOP 100
        id = IDENTITY( INT,1,1 )
INTO    dbo.t100
FROM    sysobjects

2.模拟生成丢失日期的目标表,日期对应的天数能被3或者7整除的都是丢失的日期

/*取到当前月的月初和月末日期*/
WITH    x0
          AS ( SELECT   CONVERT(DATE, DATEADD(d, -DAY(GETDATE()) + 1,
                                              GETDATE())) AS date_begin ,
                        CONVERT(DATE, DATEADD(d, -DAY(GETDATE()),
                                              DATEADD(m, 1, GETDATE()))) AS date_end
             ),/*生成日期序号*/
        x1
          AS ( SELECT   date_begin ,
                        date_end ,
                        DATEDIFF(d, date_begin, date_end) + 1 AS nday
               FROM     x0
             ),/*遍历本月的日期*/
        x2
          AS ( SELECT   ddate ,
                        id
               FROM     ( SELECT    DATEADD(d, id - 1, date_begin) AS ddate ,
                                    id
                          FROM      t100
                                    LEFT JOIN x1 ON t100.id <= x1.nday
                        ) t
               WHERE    ddate IS NOT NULL
             )
    SELECT  ddate
    INTO    testDate
    FROM    x2
    WHERE   ( id % 3 != 0 )
            AND ( id % 7 != 0 )

3.找出缺失的日期

SELECT  x2.*
FROM    x2
        LEFT JOIN testDate ON x2.ddate = testDate.ddate
WHERE   testDate.ddate IS NULL

好了,我们来对比一下数据,左边是目标表,右边是缺失日期数据集,刚好对得上。

时间: 2024-12-28 01:30:00

找出范围内丢失的数据的相关文章

Matlab.NET混合编程技巧之——找出Matlab内置函数

原文:[原创]Matlab.NET混合编程技巧之--找出Matlab内置函数 Matlab与.NET的混合编程,掌握了基本过程,加上一定的开发经验和算法基础,肯定不难.反之,有时候一个小错误,可能抓破脑袋,加班几个晚上,调试才能解决.同样,由于Matlab.NET混编的特殊性,加上MathWorks的原因,英文文档和没有披露一些详细的细节(甚至不允许反编译MWArray.dll,呵呵,它不允许,不代表你不会哦).经过很多项目,和大量的实验,也发现了一些小技巧和小秘密,今天就分享其中一个,先做一个

Java实现升序排列的整形数组A,元素两两不相等找出A[i]=i的数据

import java.util.ArrayList; //升序排列的整形数组A,元素两两不相等.请设计高效的算法找出A[i]=i的数据. //使用二种方法 public class BinarySearch { public static void main(String[] args) {     int[] nums={-1,1,2,3};     ArrayList<Integer> res=find(nums);     for(int e:res){      System.out

找出诡异的Bug:数据怎么存不进去

带着学生做课程设计.程序一大,课程中做过了小项目,练过了分解动作,一到合起来了,难免还是要乱了分寸.事实上,实战的功夫,就是这样出来的.(课程设计指导视频链接(第36课时,3.18 银行系统开发).课程主页在链接,指导文档见链接,演示样例程序见链接). 话说,已经有两位做银行系统的同学和我说,"文件里写不进去数据. 程序一退出,明明写进去了.结果却是空文件."这不是一个小打击. 做软件,找Bug,有些像打空气,使半天劲.人家就不理你. 学计算机的人.练的就是这种功夫.要学会自己创建线索

用LINQ( group by having) 找出Datatable中的重复数据

private void butCF_Click(object sender, RoutedEventArgs e) { if (DatagridDatatable != null && DatagridDatatable.Rows.Count > 0) {//group by 日期,合同号,部门 having count(记录编号)>0 找出 日期 合同号 部门重复的记录 var query = (from t in DatagridDatatable.AsEnumerabl

数据库中通过group by找出表中的重复数据

有时候在做数据割接时会碰到数据插入失败的情况,大部分都是导出的数据中存在重复导致的.我们可以通过查询语句带分组条件来确认是否有重复数据.例如我现在有表 t_wlf_info,其中有个 username字段,我可以通过如下语句看username的重复记录: select * from t_wlf_info where username in (select username from t_wlf_info group by username having count(*) > 1); 也可以通过这

shell之找出100内被3整除的数

#!/bin/bash j=0 for i in {1..100};do mod=$((i%3)) if [ $mod = 0 ] ;then num_group[$j]=$i #将符合的数复制给num_group数组 j=$(($j+1)) fi done for ((m=0;m<${#num_group[@]};m++));do #for循环遍历数组 echo -n "${num_group[$m]} " done echo -e "\r" #光标移至行首

找出N个数据中的最大的K个数据---堆排序

从N个数据中找出最大的K个数据,而且这里有一个限制:内存里存不下所有的N个数据,但是可以存下K个数据.这就让我们打消了用排序的方法来解的念头. 在这里我们使用堆排序来完成. 因为我们只能有K个数据那么大的空间,所以我们建一个K大的堆,将N的前K个数据插入到堆中,然后调整堆.(对于堆结构不了解的可以查看我微博  http://helloleex.blog.51cto.com/10728491/1768758) 对于最大的K个数据,我们要怎么找出来呢.我们首先要确定我们是要用大顶堆还是小顶堆.  用

海量日志数据__怎么在海量数据中找出重复次数最多的一个

问题一:         怎么在海量数据中找出重复次数最多的一个 算法思想:         方案1:先做hash,然后求模映射为小文件,求出每个小文件中重复次数最多的一个,并记录重复次数. 然后找出上一步求出的数据中重复次数最多的一个就是所求(如下). 问题二: 网站日志中记录了用户的IP,找出访问次数最多的IP. 算法思想:       IP地址最多有2^32=4G种取值可能,所以不能完全加载到内存中. 可以考虑分而治之的策略: map 按照IP地址的hash(IP)%1024值,将海量日志

找出1小时内占用cpu最多的10个进程的shell脚本

cpu时间是一项重要的资源,有时,我们需要跟踪某个时间内占用cpu周期最多的进程. 在普通的桌面系统或膝上系统中,cpu处于高负荷状态也许不会引发什么问题.但对于需要处理大量请求的服务器来讲,cpu是极其重要的资源. 通过监视某个时期内cpu的使用情况,我们可以找出长期占用cpu的进程并对其进行优化,或调试其它相关问题. 在linux系统中,ps命令用于收集系统中进程的详细信息.这些信息包括cpu使用情况.正在执行的命令.内存使用.进程状态等.记录在一个小时内占用过的cpu的进程,然后通过恰当地