SQL语句时间批量修改
答案:4 悬赏:20 手机版
解决时间 2021-03-24 06:07
- 提问者网友:缘字诀
- 2021-03-23 18:47
SQL语句时间批量修改
最佳答案
- 五星知识达人网友:梦中风几里
- 2021-03-23 19:31
用一条语句搞不出来,我给你想了个办法,不过我的数据字段不是日期型,是字符串型的。
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
你的问题,实际就是要把当前的时间变为下一条的时间,那么只要取比当前时间大的时间里,最小的那条的记录就行了。不过这样取最后一条有点问题,因为没有比他大的时间了,因此需要特别处理一下。
我试验了,可行。不过以上代码,你可能要分别执行,或者放入一个存储过程,或者函数里,总之,一条语句不容易搞定。
全部回答
- 1楼网友:山君与见山
- 2021-03-23 20:46
一个sql语句是实现不的了,除非写存储过程啦。
- 2楼网友:鱼芗
- 2021-03-23 20:18
办法肯定是有的,就是LZ 描述的不清楚。
你的表 索引了没? 什么是【后面的那条记录】,是排过序的? 怎么才算后面。 还有你举得例子也不太好,
如果把【数据 eat 2010/8/6】这条数据中的时间改为2010/8/23后呢?改为很久以前呢?很久以后的呢? 是算修改前的后面,还是修改后的后面?
问问题前要自己先思考好了,还要让我来补充问题。
你的表 索引了没? 什么是【后面的那条记录】,是排过序的? 怎么才算后面。 还有你举得例子也不太好,
如果把【数据 eat 2010/8/6】这条数据中的时间改为2010/8/23后呢?改为很久以前呢?很久以后的呢? 是算修改前的后面,还是修改后的后面?
问问题前要自己先思考好了,还要让我来补充问题。
- 3楼网友:你可爱的野爹
- 2021-03-23 20:09
你的需求需要通过存储过程或是触发器才能实现
下面是我的一些想法,楼主可以参考下(有局限性,如果时间不唯一,就会出问题)
--对需要的事件做时间更新
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!
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯