數(shù)據(jù)庫環(huán)境 SQL SERVER2008R2
需求:有一個表的日期字段,存的是每天的日期,且該字段存在唯一性約束。由于管理員誤操作,把當前月的一些日期給刪了,
現(xiàn)在要把被刪除的日期給找出來。
實現(xiàn)思路:創(chuàng)建一個日期輔助表,輔助表存的是當前月的所有日期,再和目標表左關(guān)聯(lián),日期對應(yīng)不上的則是丟失的日期。
數(shù)據(jù)準備:
1.創(chuàng)建一個1-100的自然數(shù)列表
SELECT TOP 100 id = IDENTITY( INT,1,1 )INTO dbo.t100FROM sysobjects
2.模擬生成丟失日期的目標表,日期對應(yīng)的天數(shù)能被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.ddateWHERE testDate.ddate IS NULL
好了,我們來對比一下數(shù)據(jù),左邊是目標表,右邊是缺失日期數(shù)據(jù)集,剛好對得上。
新聞熱點
疑難解答
圖片精選