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