首页 > SQLServer 2008 在数据库层面进行简单约束的问题!急急急

SQLServer 2008 在数据库层面进行简单约束的问题!急急急

列名   
CDate       LastDayRestWeight     TodayRestWeight
2013-9-9    27                    27
2013-9-10   27                    27
2013-9-11   27                    18
2013-9-12   18                    18
2013-9-13   18                    18
2013-9-14   18                    16
2013-9-15   16                    16

大家好,我在项目中遇到个很头疼的问题,如上有这样的数据结构, 我希望约束每日的LastDayRestWeight=前一个日期的TodayRestWeight。 有木有人知道在Sqlserver 2008 里面需要写怎样的约束或者触发器?

目前我的数据库里有个别数据的LastDayRestWeight!=前一个日期的TodayRestWeight。(不等于) 我应该通过怎样的Sql语句找出来他们呢?非常感激不尽!。。。。。

C的业务逻辑写了约束了。几百万条里面冒出就2条错误的。因为没在数据库层面约束 怎么才能完全约束。。。


查看相近两行日期间隔不是一天的办法:
准备测试数据:

;WITH t(CDate,LastDayRestWeight,TodayRestWeight) AS (
    select '2013-9-09',27,27 UNION
    select '2013-9-10',27,27 UNION
    select '2013-9-11 ',27,18 UNION
    select '2013-9-12',18,18 UNION
    select '2013-9-13',18,18 UNION
    select '2013-9-14',18,16 UNION
    select '2013-9-15',16,16 UNION
    select '2013-9-17',16,16
)
SELECT * INTO #T FROM t

查询,其中pt.df就是间隔天数:
新加数据,你可以用max取得最大的日期,然后dateadd加一天,但是我感觉这样好像不合理,这个日期不是应该代表某个实际含义的日期吗?如果仅是循序你用个自增长就行了

SELECT t.*,pt.pCDate,pt.df FROM #T AS t
OUTER APPLY (
    SELECT TOP 1 tt.CDate AS pCDate,DATEDIFF(d,t.CDate,tt.CDate) AS df 
     FROM #t AS tt WHERE DATEDIFF(d,t.CDate,tt.CDate)>0 ORDER BY tt.CDate
) pt
WHERE ISNULL(pt.df,0)>1
ORDER BY t.CDate
【热门文章】
【热门文章】