SQL语句时间批量修改
一个表的数据,每条数据都有一个时间字段,当我修改其中一条记录的时间时,这条记录后面的记录的时间字段会自动改为它后面的那条记录的时间数据。比如:表字段eventtime数据...
一个表的数据,每条数据都有一个时间字段,当我修改其中一条记录的时间时,这条记录后面的记录的时间字段会自动改为它后面的那条记录的时间数据。
比如:表
字段 event time
数据 set 2010/8/2
数据 eat 2010/8/6
数据 foot 2010/8/9
数据 see 2010/8/15
数据 look 2010/8/20
数据 get 2010/8/25
当我把【数据 eat 2010/8/6】这条数据中的时间改为2010/8/9后,
表就会修改成这样
字段 event time
数据 set 2010/8/2
数据 eat 2010/8/9
数据 foot 2010/8/15
数据 see 2010/8/20
数据 look 2010/8/25
数据 get 2010/8/26
注意时间字段是顺延修改的,最后一个时间字段则是加一
求SQL语句写法。。。。
表有主键,设计规范
可能用图会比较清楚 展开
比如:表
字段 event time
数据 set 2010/8/2
数据 eat 2010/8/6
数据 foot 2010/8/9
数据 see 2010/8/15
数据 look 2010/8/20
数据 get 2010/8/25
当我把【数据 eat 2010/8/6】这条数据中的时间改为2010/8/9后,
表就会修改成这样
字段 event time
数据 set 2010/8/2
数据 eat 2010/8/9
数据 foot 2010/8/15
数据 see 2010/8/20
数据 look 2010/8/25
数据 get 2010/8/26
注意时间字段是顺延修改的,最后一个时间字段则是加一
求SQL语句写法。。。。
表有主键,设计规范
可能用图会比较清楚 展开
4个回答
展开全部
用一条语句搞不出来,我给你想了个办法,不过我的数据字段不是日期型,是字符串型的。
declare @maxdate varchar(10),@dt varchar(10)
select @maxdate=max(thetime) from t2
set @dt = convert(varchar(10),dateadd(day,1,convert(datetime,@maxdate)),102)
update t2 set nexttime=isnull(
(select min(thetime) from t2 tmp where tmp.thetime > t.thetime )
,@dt)
from t2 t
update t2 set thetime = nexttime
////////////////////////////////////
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[t2]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [dbo].[t2]
GO
CREATE TABLE [dbo].[t2] (
[id] [int] IDENTITY (1, 1) NOT NULL ,
[event] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
[thetime] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
[nexttime] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL
) ON [PRIMARY]
GO
此外,我在表里加了一个字段,nexttime,先把下一条数据的日期查出来,放到这个字段,然后再更新。
/////////////////////////////////
我又试了一下把time变为日期类型,代码更简单,不用转换了。
declare @maxdate datetime
select @maxdate=max(thetime) from t2
set @maxdate=dateadd(day,1,@maxdate)
update t2 set nexttime=isnull(
(select min(thetime) from t2 tmp where tmp.thetime > t.thetime )
,@maxdate)
from t2 t
update t2 set thetime=nexttime
你的问题,实际就是要把当前的时间变为下一条的时间,那么只要取比当前时间大的时间里,最小的那条的记录就行了。不过这样取最后一条有点问题,因为没有比他大的时间了,因此需要特别处理一下。
我试验了,可行。不过以上代码,你可能要分别执行,或者放入一个存储过程,或者函数里,总之,一条语句不容易搞定。
declare @maxdate varchar(10),@dt varchar(10)
select @maxdate=max(thetime) from t2
set @dt = convert(varchar(10),dateadd(day,1,convert(datetime,@maxdate)),102)
update t2 set nexttime=isnull(
(select min(thetime) from t2 tmp where tmp.thetime > t.thetime )
,@dt)
from t2 t
update t2 set thetime = nexttime
////////////////////////////////////
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[t2]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [dbo].[t2]
GO
CREATE TABLE [dbo].[t2] (
[id] [int] IDENTITY (1, 1) NOT NULL ,
[event] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
[thetime] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
[nexttime] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL
) ON [PRIMARY]
GO
此外,我在表里加了一个字段,nexttime,先把下一条数据的日期查出来,放到这个字段,然后再更新。
/////////////////////////////////
我又试了一下把time变为日期类型,代码更简单,不用转换了。
declare @maxdate datetime
select @maxdate=max(thetime) from t2
set @maxdate=dateadd(day,1,@maxdate)
update t2 set nexttime=isnull(
(select min(thetime) from t2 tmp where tmp.thetime > t.thetime )
,@maxdate)
from t2 t
update t2 set thetime=nexttime
你的问题,实际就是要把当前的时间变为下一条的时间,那么只要取比当前时间大的时间里,最小的那条的记录就行了。不过这样取最后一条有点问题,因为没有比他大的时间了,因此需要特别处理一下。
我试验了,可行。不过以上代码,你可能要分别执行,或者放入一个存储过程,或者函数里,总之,一条语句不容易搞定。
展开全部
你的需求需要通过存储过程或是触发器才能实现
下面是我的一些想法,楼主可以参考下(有局限性,如果时间不唯一,就会出问题)
--对需要的事件做时间更新
update log_table t set t='2010/8/9'
where t.event='eat' and t.time='2010/8/6';
--取得所有需要做时间顺延的事件
insert into event_1
select t.event from log_table t where t.time>'2010/8/6' and t.event!='eat' order by t.time;
--取得所有需要做时间顺延的事件 原对应的时间
insert into time_1
select t.time from log_table t where t.time>'2010/8/6' and t.event!='eat' order by t.time;
--删除最小的时间
delete from time_1 t where t.time=(select min(time) from time_1);
--增加最后一天对应的时间
insert into time_1 select max(time)+1 days from time_1;--(DB2可以实现,其他没试过)
--删除需要做时间顺延的数据
delete from log_table t where t.time>'2010/8/6' and t.event!='eat'
--插入需要做时间顺延的数据
insert into log_table values(select event from event_1,select time from time_1);
希望对你有帮助,共同进步
Best Regards!
下面是我的一些想法,楼主可以参考下(有局限性,如果时间不唯一,就会出问题)
--对需要的事件做时间更新
update log_table t set t='2010/8/9'
where t.event='eat' and t.time='2010/8/6';
--取得所有需要做时间顺延的事件
insert into event_1
select t.event from log_table t where t.time>'2010/8/6' and t.event!='eat' order by t.time;
--取得所有需要做时间顺延的事件 原对应的时间
insert into time_1
select t.time from log_table t where t.time>'2010/8/6' and t.event!='eat' order by t.time;
--删除最小的时间
delete from time_1 t where t.time=(select min(time) from time_1);
--增加最后一天对应的时间
insert into time_1 select max(time)+1 days from time_1;--(DB2可以实现,其他没试过)
--删除需要做时间顺延的数据
delete from log_table t where t.time>'2010/8/6' and t.event!='eat'
--插入需要做时间顺延的数据
insert into log_table values(select event from event_1,select time from time_1);
希望对你有帮助,共同进步
Best Regards!
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
一个sql语句是实现不的了,除非写存储过程啦。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
办法肯定是有的,就是LZ 描述的不清楚。
你的表 索引了没? 什么是【后面的那条记录】,是排过序的? 怎么才算后面。 还有你举得例子也不太好,
如果把【数据 eat 2010/8/6】这条数据中的时间改为2010/8/23后呢?改为很久以前呢?很久以后的呢? 是算修改前的后面,还是修改后的后面?
问问题前要自己先思考好了,还要让我来补充问题。
你的表 索引了没? 什么是【后面的那条记录】,是排过序的? 怎么才算后面。 还有你举得例子也不太好,
如果把【数据 eat 2010/8/6】这条数据中的时间改为2010/8/23后呢?改为很久以前呢?很久以后的呢? 是算修改前的后面,还是修改后的后面?
问问题前要自己先思考好了,还要让我来补充问题。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询