2006-10-23

ASP中如何按时间自动生成编号

如何按时间自动生成类似20061023001的编号,到网络上搜索得到的结果令人十分失望!100篇文章有99篇是相同的,内容更是一字不差,见《ASP自动生成编号的方法》。最令人气愤的还不是这个,而是搜索到的内容很滥,根本毫无用处。在此强烈鄙视一下那些相互转载垃圾的垃圾网站。

那么如何生成20061023001这样的编号呢。这个编号的前8位是时间,后面三位每天从001开始递增。

假设数据库中有id和number,number是文本字段,用来存储这个编号。

< %
TempID=Year(now())&Right("00" & Month(now()),2)&Right("00" & Day(now()),2)&"001"
sql="select * from table order by id desc"
set rs=server.createobject("adodb.recordset")
rs.open sql,conn,1,3
If Left(TempID,8)=Left(rs("number"),8) Then
TempID=rs("number")+1
End If
%>


那其中变量TempID的初始值是今天的001号,如果最后一条记录是今天的,则在number上加1,赋值给TempID。

最后在插入的时候令number等于TempID就可以了。

exec="insert into table(number)values('"&TempID&"')"
conn.execute exec


这是不是错了啊,因为简单到我不敢相信自己的眼睛。但是在程序中已经通过验证了。不足之处还请高手指正!!!

UPDATE@2006.10.25:感谢fisker提醒,假如数据库中还没有数据,则程序会报错,而且执行效率也有问题。现修改如下

< %
TempID=Year(now())&Right("00" & Month(now()),2)&Right("00" & Day(now()),2)&"001"
sql="select top 1 [number] from table order by id desc"
set rs=server.createobject("adodb.recordset")
rs.open sql,conn,1,3
If not rs.eof and rs.bof Then
ElseIf Left(TempID,8)=Left(rs("number"),8) Then
TempID=rs("number")+1
End If
%>

6 則留言:

  1. 那天你问我后,我又想了一下,关于最后的补零用下面这个函数比较好,这样的话在其它的程序里也能方便的使用了。

    function FixLen(sNum,sLen)
    dim sTemp
    sTemp=String(sLen-len(sNum),"0")&sNum
    FixLen=sTemp
    end function

    回覆刪除
  2. 还有,你写的这个并没有判断是否是第二天,第二天的时候并不能重新编号噢

    回覆刪除
  3. If Left(TempID,8)=Left(rs("number"),8) Then
    这句话你觉得是干吗用的呢 :em14:

    回覆刪除
  4. ASP我都不是很熟,别说用函数了 :em06:

    回覆刪除
  5. 噢,看漏了,不错,比那天我想的那个好

    回覆刪除
  6. 很显然效率不够,一些细节没注意.等下发个邮件给你.

    回覆刪除