YYMM#### 如何生成发票号

YYMM#### how to generate invoice number

我必须生成像 YYMM#### 这样的发票编号 YY 和 MM 很容易,我们可以使用今天的日期来获取它们,但是如何添加从 001 到 999 结尾的自定义 4 位数字 我正在使用 sql 来存储发票编号

如果您每月最多只有 999 张发票,您可能不必担心快速连续两张发票所涉及的低效率问题,因此您需要分别生成一张发票:

  • 找出要使用的前缀(注意这里的时区...)
  • 通过查询找到最高的发票 ID,以查找以您的前缀开头的所有发票 ID(如果您使用的是数字类型,则在可能的最小值和最大值之间),按 ID 排序(降序),只取第一个一个 1
  • 解析并加一生成新的ID
  • 尝试插入具有给定 ID 的新发票
  • 如果您违反约束条件(重复 ID),请重新执行该过程

如果您必须处理 很多 的发票,这些发票可能来自许多不同的客户,并且不需要连续的发票 ID,您可以使用 lo/hi algorithm每个客户端有效 "reserving" 个 ID。不过,对于这种情况,这听起来有点矫枉过正。

哦,如果一个月内 超过 999 张发票,你应该弄清楚你想要发生什么...


1 你可能会在这里避免过滤,并假设其他一切都将遵循相同的约定,但我个人会过滤

如果您想在 SQL 服务器端执行此操作,您需要在 sql 服务器中创建一个 SEQUENCE 对象,您可以执行类似 ..

序列

CREATE SEQUENCE dbo.GetInvoiceNumber
    AS INT
    START WITH 1
    INCREMENT BY 1
    MINVALUE 1 
    MAXVALUE 999
    CYCLE
    CACHE 10
;

SQL 服务器调用

SELECT CONVERT(VARCHAR(4), GETDATE(), 12) 
       + RIGHT('0000' 
       + CAST( NEXT VALUE FOR dbo.GetInvoiceNumber AS VARCHAR(3)),4)

结果

查询将 return 值如

15080001
15080002
15080003
15080004
.......

注意

您确定您的客户在一个月内不会开出超过 999 张发票吗?我认为这个数字应该相当高以防万一。