SQL 每月的3流水号,超过999用ABC表示
答案:2 悬赏:40 手机版
解决时间 2021-04-06 16:48
- 提问者网友:欲望失宠
- 2021-04-05 21:35
SQL 每月的3流水号,超过999用ABC表示
最佳答案
- 五星知识达人网友:人類模型
- 2021-04-05 22:45
何必要如此呢,扩大位数岂不更好?
下面是你需要的代码主体,具体参数定义看注释。
---定义当前的流水号,可以从数据库中获取,此处为测试值
DECLARE @CURR_LSH VARCHAr(7)
---新流水号
DECLARE @LSH VARCHAr(7)
---旧流水号第5位
DECLARE @FIRSTCHAR VARCHAr(1)
---旧流水号最后2位的数值
DECLARE @LASTCHAR2 INT
---旧流水号第5位的asc码
DECLARE @FIRSTCHARASCII INT
---新的后3位流水号
DECLARE @LASTCHAR3NEW VARCHAr(3)
---测试的旧流水号
SET @CURR_LSH = 'B307Z98'
---定义当前年份最后1位和两位的月份
DECLARE @YEAR VARCHAr(1)
DECLARE @MONTH VARCHAr(2)
SET @YEAR = SUBSTRINg(CONVERT(VARCHAR,DATEPART(YEAR,GETDATE())),4,1)
SET @MONTH = RIGHt('0' + CONVERT(VARCHAR,DATEPART(MONTH,GETDATE())), 2)
SET @FIRSTCHAR = SUBSTRINg(@CURR_LSH, 5,1)
SET @FIRSTCHARASCII = ASCIi(@FIRSTCHAR)
---@FIRSTCHARASCII 48-57表示0-9,65-90表示A-Z
SET @LASTCHAR2 = CONVERT(INT,SUBSTRINg(@CURR_LSH,6,2))
IF @LASTCHAR2 <99
BEGIN
SET @LASTCHAR3NEW = @FIRSTCHAR + RIGHt('00' + CONVERT(VARCHAR, @LASTCHAR2 + 1),2)
END
ELSE
BEGIN
IF @FIRSTCHARASCII < 57
SET @LASTCHAR3NEW = CONVERT(VARCHAR, CONVERT(INT,@FIRSTCHAR + '00') + CONVERT(INT, RIGHt('00' + CONVERT(VARCHAR, @LASTCHAR2 + 1),3)))
ELSE IF @FIRSTCHARASCII = 57
SET @LASTCHAR3NEW = 'A00'
ELSE
SET @LASTCHAR3NEW = CHAr(@FIRSTCHARASCII + 1) + '00'
END
---输出你需要的新流水号
SET @LSH = 'B' + @YEAR + @MONTH + @LASTCHAR3NEW
---打印出来
PRINT @LSH追问可能是我没有说清楚,是超过999用A00-A99,超过A99用B00-B99,以此类推…可能是我没有说清楚,是超过999用A00-A99,超过A99用B00-B99,以此类推…可能是我没有说清楚,是超过999用A00-A99,超过A99用B00-B99,以此类推…可能是我没有说清楚,是超过999用A00-A99,超过A99用B00-B99,以此类推…追答是这样的,你验证一下就明白了。
下面是你需要的代码主体,具体参数定义看注释。
---定义当前的流水号,可以从数据库中获取,此处为测试值
DECLARE @CURR_LSH VARCHAr(7)
---新流水号
DECLARE @LSH VARCHAr(7)
---旧流水号第5位
DECLARE @FIRSTCHAR VARCHAr(1)
---旧流水号最后2位的数值
DECLARE @LASTCHAR2 INT
---旧流水号第5位的asc码
DECLARE @FIRSTCHARASCII INT
---新的后3位流水号
DECLARE @LASTCHAR3NEW VARCHAr(3)
---测试的旧流水号
SET @CURR_LSH = 'B307Z98'
---定义当前年份最后1位和两位的月份
DECLARE @YEAR VARCHAr(1)
DECLARE @MONTH VARCHAr(2)
SET @YEAR = SUBSTRINg(CONVERT(VARCHAR,DATEPART(YEAR,GETDATE())),4,1)
SET @MONTH = RIGHt('0' + CONVERT(VARCHAR,DATEPART(MONTH,GETDATE())), 2)
SET @FIRSTCHAR = SUBSTRINg(@CURR_LSH, 5,1)
SET @FIRSTCHARASCII = ASCIi(@FIRSTCHAR)
---@FIRSTCHARASCII 48-57表示0-9,65-90表示A-Z
SET @LASTCHAR2 = CONVERT(INT,SUBSTRINg(@CURR_LSH,6,2))
IF @LASTCHAR2 <99
BEGIN
SET @LASTCHAR3NEW = @FIRSTCHAR + RIGHt('00' + CONVERT(VARCHAR, @LASTCHAR2 + 1),2)
END
ELSE
BEGIN
IF @FIRSTCHARASCII < 57
SET @LASTCHAR3NEW = CONVERT(VARCHAR, CONVERT(INT,@FIRSTCHAR + '00') + CONVERT(INT, RIGHt('00' + CONVERT(VARCHAR, @LASTCHAR2 + 1),3)))
ELSE IF @FIRSTCHARASCII = 57
SET @LASTCHAR3NEW = 'A00'
ELSE
SET @LASTCHAR3NEW = CHAr(@FIRSTCHARASCII + 1) + '00'
END
---输出你需要的新流水号
SET @LSH = 'B' + @YEAR + @MONTH + @LASTCHAR3NEW
---打印出来
PRINT @LSH追问可能是我没有说清楚,是超过999用A00-A99,超过A99用B00-B99,以此类推…可能是我没有说清楚,是超过999用A00-A99,超过A99用B00-B99,以此类推…可能是我没有说清楚,是超过999用A00-A99,超过A99用B00-B99,以此类推…可能是我没有说清楚,是超过999用A00-A99,超过A99用B00-B99,以此类推…追答是这样的,你验证一下就明白了。
全部回答
- 1楼网友:刀戟声无边
- 2021-04-05 23:42
参考了第一位兄弟的答案
DECLARE @Key INT
DECLARE @ASCII INT
DECLARE @PreKey VARCHAr(32)
DECLARE @SerialNo VARCHAr(32)
--取已经存在的最大值(需要自行修改一下)
IF NOT EXISTS (SELECt SerialNo FROM table)
SET @SerialNo = 'B000000'
ELSE
SELECt @SerialNo = SerialNo FROM tbale
--计算新的前缀
SET @PreKey = LEFt(@SerialNo, 1)
SELECT @prekey = @prekey
+ CAST(RIGHt(DATEPART(year, GETDATE()), 1) * 100
+ DATEPART(MONTH, GETDATE()) AS VARCHAr(32))
--计算流水号部分
SET @key = RIGHt(@SerialNo, 2)
IF @Key = 99
BEGIN
SET @ASCII = ASCIi(LEFt(RIGHt(@SerialNo, 3), 1)) + 1
SET @key = 0
END
ELSE
BEGIN
SET @ASCII = ASCIi(LEFt(RIGHt(@SerialNo, 3), 1))
SET @key = @key + 1
END
IF @ASCII = 58
SET @ASCII = 65
IF @ASCII > 90
GOTO Err
--输出最终的编号
SELECT @PreKey + CHAr(@ASCII) + RIGHt('00' + CAST(@key AS VARCHAR), 2)
DECLARE @Key INT
DECLARE @ASCII INT
DECLARE @PreKey VARCHAr(32)
DECLARE @SerialNo VARCHAr(32)
--取已经存在的最大值(需要自行修改一下)
IF NOT EXISTS (SELECt SerialNo FROM table)
SET @SerialNo = 'B000000'
ELSE
SELECt @SerialNo = SerialNo FROM tbale
--计算新的前缀
SET @PreKey = LEFt(@SerialNo, 1)
SELECT @prekey = @prekey
+ CAST(RIGHt(DATEPART(year, GETDATE()), 1) * 100
+ DATEPART(MONTH, GETDATE()) AS VARCHAr(32))
--计算流水号部分
SET @key = RIGHt(@SerialNo, 2)
IF @Key = 99
BEGIN
SET @ASCII = ASCIi(LEFt(RIGHt(@SerialNo, 3), 1)) + 1
SET @key = 0
END
ELSE
BEGIN
SET @ASCII = ASCIi(LEFt(RIGHt(@SerialNo, 3), 1))
SET @key = @key + 1
END
IF @ASCII = 58
SET @ASCII = 65
IF @ASCII > 90
GOTO Err
--输出最终的编号
SELECT @PreKey + CHAr(@ASCII) + RIGHt('00' + CAST(@key AS VARCHAR), 2)
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯