如何生成具有财政年度前缀的AutoIncrement编号?

时间:2017-10-28 12:28:38

标签: sql-server datetime auto-increment

我的客户希望根据他们正在工作的财政年度(当月4月到明年3月)为每个进入数据库的票号生成代码,并且需要将财务年份更改为0重新设置为

示例:

ID
17/18/0000001
17/18/0000002
... 
18/19/0000001
18/19/0000002
...

enter image description here

如果财务年度存储在数据库中,例如开始结束月份和年份。我们怎么能检查这是明年的布罗达!重置数字。

2 个答案:

答案 0 :(得分:0)

我不会尝试在内部尝试维护这样的计数器。相反,我会在查询时生成。下面的查询假定您的表确实有一个普通的自动增量计数器ID以及该会计年度的year int列。我们可以使用以下方法生成您想要的计数器:

SELECT
    RIGHT(CONVERT(varchar(4), year), 2) + '/' +
    RIGHT(CONVERT(varchar(4), year + 1), 2) + '/' +
    RIGHT('0000000' +
        CAST(ROW_NUMBER() OVER (PARTITION BY year ORDER BY ID) AS VARCHAR), 7)
FROM yourTable;

Demo

答案 1 :(得分:0)

客户端永远是对的。假设您有一个表

create table #trans(
    id int identity(1,1),
    transDate datetime
    --other fields
    )
--the table is filled

declare @dStart date='20160401', --start and end dates 
        @dEnd date='20170331'    --of the first financial year

;with fy as ( -- fill following years
select 1 id, @dStart dStart, @dEnd dEnd
union all
select id+1,DATEADD(year,1,dStart),DATEADD(year,1,dEnd)
from fy 
where id<5 --"majic" 5 is arbitrary
)
select  dStart,dEnd,t.*, 
    right(cast(year(dstart) as varchar),2)+'/'+right(cast(year(dEnd) as varchar),2)+'/' -- F.Y. label
    + FORMAT( ROW_NUMBER() over(
         partition by right(cast(year(dstart) as varchar),2)+'/'+right(cast(year(dEnd) as varchar),2)+'/' --restart numbering each F.Y.
         order by t.id),'000000') ticket
from fy
inner join #trans t on cast(t.transDate as date) between fy.dStart and fy.dEnd

并拥有客户想要的东西 免责声明:如果删除某些数据,则会更改票证编号。