2014-10-28 65 views
0

我的发票号码格式为[YYYY]-[4-digit Number]。例如,2014-0123。当存储过程的年份发生变化时(即[Next year]-[0001]),我想将发票编号重置为2015-0001。我怎样才能做到这一点?我也希望每年都会发生这种情况。如何检查SQL Server 2008中的年份是否更改?

这是我用来生成发票号码的查询。

SELECT @INV_NO = SUBSTRING(CAST(SWITCHOFFSET(SYSDATETIMEOFFSET(), '+05:30') AS VARCHAR),1,4) 
+ '-' + right('0000'+ ISNULL(CONVERT(varchar(max),CONVERT(BIGINT,MAX(SUBSTRING(INV_NO,6,4)))+1),1),4) 
FROM dbo.IMG_TRN_INV 

现在我不知道如何从存储过程中重置发票号码。

+1

请在GETDATE()和DATEPART一些研究,煮了一些SQL,并张贴在这里我们可能会提供帮助。您还需要描述哪些流程会创建发票号码。它是一个应用程序吗?然后你需要发布代码。 – 2014-10-28 09:37:21

+0

@Aniruddha编辑你的问题,而不是 – artm 2014-10-28 09:39:38

+0

我想做一个触发器,基于当前的日期,我想。 – 2014-10-28 09:46:18

回答

0

假设IMG_TRN_INV是保存发票编号(我用一个临时表:@IMG_TRN_INV):表

-- temporary table setup 
declare @IMG_TRN_INV table (id int identity(1, 1), INV_NO varchar(10)) 
insert into @IMG_TRN_INV(INV_NO) values ('2013-0018') -- use this to test new number for 2014 
-- insert into @IMG_TRN_INV(INV_NO) values ('2014-0003') -- use this to test existing number for 2014 

declare @INV_NO varchar(10) 

if(exists(select * from @IMG_TRN_INV where patindex(cast(year(getdate()) as varchar(10)) + '-%', INV_NO) > 0)) 
    begin 
     -- generate new invoice number from the last existing 
     declare @LAST_INV_NO varchar(10) = (select top 1 INV_NO from @IMG_TRN_INV order by INV_NO desc) 
     declare @NEW_NO int = cast(replace(@LAST_INV_NO, cast(year(getdate()) as varchar(10)) + '-', '') as int) + 1 

     set @INV_NO = cast(year(getdate()) as varchar(10)) + '-' + replicate('0', 4 - len(@NEW_NO)) + cast(@NEW_NO as varchar(10)) 
    end 
else 
    begin 
     -- generate new invoice number for this year 
     set @INV_NO = cast(year(getdate()) as varchar(10)) + '-0001' 
    end 

print @INV_NO 
+0

谢谢。我将当前年份存储在一张表中,然后每次将其与从getdate()中提取的年份进行比较。我认为它的工作。也会尝试你的解决方案。 – Aniruddha 2014-10-28 11:33:29