如何在现有的表中利用年月生成一个顺序号?

stadong 2004-05-02 03:41:05
现在表中有日期字段rq,怎么样才能依据这个日期字段生成一个顺序号RK04040001,这个顺序号是按年月更新的!
...全文
98 13 点赞 打赏 收藏 举报
写回复
13 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
zjcxc 元老 2004-05-02
--如果你的表中rkrq无序,而且可能重复的话,那你就在你的表中加一个标识字段来处理(下面假设你的标识字段名为id,当然,如果表中有主键,可以直接用主键代替id)

update rk_bak set rkdh='RK'+CONVERT(char(4),rkrq,12)
+right(10000+(
select count(*) from rk_bak
where datediff(month,rkrq,a.rkrq)=0 and rkrq<a.rkrq
or(rkrq=a.rkrq and id<=a.id)
),4)
from rk_bak a
  • 打赏
  • 举报
回复
zjcxc 元老 2004-05-02
--测试

--测试数据
create table rk_bak(rkrq datetime,rkdh char(10))
insert rk_bak(rkrq)
select '1933/04/22'
union all select '1933/04/22'
union all select '2000/01/01'
union all select '2001/04/03'
union all select '2001/04/03'
union all select '2001/04/03'
union all select '2001/04/04'
union all select '2001/04/04'
union all select '2001/04/04'
union all select '2001/04/04'
union all select '2001/04/04'
union all select '2001/04/04'
union all select '2001/04/04'
union all select '2001/04/04'
union all select '2001/04/05'
union all select '2001/04/05'
union all select '2001/04/05'
union all select '2001/04/05'
union all select '2001/04/06'
go

--更新处理
declare @rq datetime,@i int
update rk_bak set @i=case datediff(month,rkrq,@rq) when 0 then @i+1 else 10001 end
,rkdh='RK'+CONVERT(char(4),rkrq,12)+right(@i,4)
,@rq=rkrq
go

--显示处理结果
select * from rk_bak
go

--删除测试
drop table rk_bak

/*--测试结果

rkrq rkdh
------------------------------------------------------ ----------
1933-04-22 00:00:00.000 RK33040001
1933-04-22 00:00:00.000 RK33040002
2000-01-01 00:00:00.000 RK00010001
2001-04-03 00:00:00.000 RK01040001
2001-04-03 00:00:00.000 RK01040002
2001-04-03 00:00:00.000 RK01040003
2001-04-04 00:00:00.000 RK01040004
2001-04-04 00:00:00.000 RK01040005
2001-04-04 00:00:00.000 RK01040006
2001-04-04 00:00:00.000 RK01040007
2001-04-04 00:00:00.000 RK01040008
2001-04-04 00:00:00.000 RK01040009
2001-04-04 00:00:00.000 RK01040010
2001-04-04 00:00:00.000 RK01040011
2001-04-05 00:00:00.000 RK01040012
2001-04-05 00:00:00.000 RK01040013
2001-04-05 00:00:00.000 RK01040014
2001-04-05 00:00:00.000 RK01040015
2001-04-06 00:00:00.000 RK01040016

(所影响的行数为 19 行)
--*/
  • 打赏
  • 举报
回复
stadong 2004-05-02
谢谢!xiaoliaoyun(流浪的云),我刚学一点sql,不好意思,看不明白你给的例子是什么意思?
  • 打赏
  • 举报
回复
xiaoliaoyun 2004-05-02
--使用SQLSERVER自带的例子数据库northwind
use northwind
go
select xuhao='PK'+convert(char(4),orderdate,12)+
right('0000'+cast((select count(*) from orders a where a.orderID<=b.orderID and datediff(month,a.orderDate,b.orderDate)=0)as varchar(4)),4),
orderID,orderDate from orders b
  • 打赏
  • 举报
回复
zjcxc 元老 2004-05-02
--生成格式为RK04040001的序号,至于你说的序号不对,得举例说明了:

UPDATE 表 SET dh='RK'+convert(char(4),getdate(),12)+right(10000
+(SELECT COUNT(*) FROM 表 WHERE datediff(month,a.rq,rq)=0 AND rq <= a.rq),4)
from 表 a
  • 打赏
  • 举报
回复
zjcxc 元老 2004-05-02
你举例说明你要什么格式?

序号不对是什么意思? 不是按年月相同的按rq从小到大生成序号吗?

  • 打赏
  • 举报
回复
zjcxc 元老 2004-05-02
UPDATE 表
SET dh =
(SELECT COUNT(*)
FROM 表
WHERE datediff(month, a.rq, rq) = 0 AND rq <= a.rq)
from 表 a
  • 打赏
  • 举报
回复
stadong 2004-05-02
那个序号不对啊?格式也不对!是不是分少了?
  • 打赏
  • 举报
回复
liang922 2004-05-02
学习
  • 打赏
  • 举报
回复
stadong 2004-05-02
UPDATE 表
SET dh =
(SELECT COUNT(*)
FROM 表
WHERE datediff(month, a.rq, rq) = 0 AND rq <= a.rq)
是这样的吗?提示错误啊?
  • 打赏
  • 举报
回复
stadong 2004-05-02
谢谢!我对sql了解太少,如果我想把表中的一个字段的内容用序号写进去应该怎么写呢?
  • 打赏
  • 举报
回复
zjcxc 元老 2004-05-02
select 序号=(select count(*) from 表 where datediff(month,a.rq,rq)=0 and rq<=a.rq),*
from 表 a
  • 打赏
  • 举报
回复
stadong 2004-05-02
是不是我的问题没说清楚呢?现在表中有一万条记录,怎么样做才可以呢?这个顺序号的格式如我上面所说,字符+年月+顺序号,每月从一开始。
  • 打赏
  • 举报
回复
相关推荐
发帖
MS-SQL Server
加入

3.3w+

社区成员

MS-SQL Server相关内容讨论专区
申请成为版主
帖子事件
创建了帖子
2004-05-02 03:41
社区公告
暂无公告