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

C# YYMM#####如何生成发票号,c#,sql-server,sql-server-2014,C#,Sql Server,Sql Server 2014,我必须生成像YYMM########YY和MM这样的发票号很容易,我们可以使用今天的日期获得它们,但是如何添加自定义的4位数字从001开始到999结束 我正在使用sql存储发票编号如果您每月最多只有999张发票,您可能不需要担心连续两张发票的效率低下,因此每个发票都需要生成一张发票: 计算出要使用的前缀(注意此处的时区…) 通过查询查找最高的发票ID,以查找以前缀开头的所有发票ID(如果使用数字类型,则在最小值和最大值之间),按ID排序(降序),仅取第一个1 解析并添加一个以生成新ID 尝试插

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

如果您每月最多只有999张发票,您可能不需要担心连续两张发票的效率低下,因此每个发票都需要生成一张发票:

  • 计算出要使用的前缀(注意此处的时区…)
  • 通过查询查找最高的发票ID,以查找以前缀开头的所有发票ID(如果使用数字类型,则在最小值和最大值之间),按ID排序(降序),仅取第一个1
  • 解析并添加一个以生成新ID
  • 尝试插入具有给定ID的新发票
  • 如果您遇到约束冲突(重复ID),请再次执行该过程
如果您必须处理大量发票,这些发票可能是由许多不同的客户机生成的,并且不需要连续的发票ID,那么您可以对每个客户机使用有效的“保留”ID。不过,在这种情况下,这听起来有点过分了

哦,如果一个月内有超过999张发票,你应该计算出你想要发生什么



1您可能会避免在此处进行筛选,并假设其他一切都将遵循相同的惯例,但就个人而言,我会筛选如果您每月最多只有999张发票,您可能不需要担心连续两张发票的低效率,因此,您需要生成一张发票:

  • 计算出要使用的前缀(注意此处的时区…)
  • 通过查询查找最高的发票ID,以查找以前缀开头的所有发票ID(如果使用数字类型,则在最小值和最大值之间),按ID排序(降序),仅取第一个1
  • 解析并添加一个以生成新ID
  • 尝试插入具有给定ID的新发票
  • 如果您遇到约束冲突(重复ID),请再次执行该过程
如果您必须处理大量发票,这些发票可能是由许多不同的客户机生成的,并且不需要连续的发票ID,那么您可以对每个客户机使用有效的“保留”ID。不过,在这种情况下,这听起来有点过分了

哦,如果一个月内有超过999张发票,你应该计算出你想要发生什么



1您可能会避免此处的筛选,并假设其他所有内容都将遵循相同的约定,但我个人认为,如果您想在SQL Server端执行此操作,则需要在SQL Server中创建一个
序列
对象,您可以执行以下操作

序列 SQL Server调用 结果 查询将返回如下值

15080001
15080002
15080003
15080004
.......
注意


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

如果您想在SQL Server端执行此操作,您需要在SQL Server中创建一个
序列
对象,您可以执行以下操作:

序列 SQL Server调用 结果 查询将返回如下值

15080001
15080002
15080003
15080004
.......
注意



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

您使用的是什么SQL RDBMS?SQL Server、MySQL或Oracle等???您是否只对转换为字符串或如何从数据库中检索下一个要使用的数字感兴趣。最好使用第二个选项@Steven您是否有许多用户同时将发票添加到数据库表中?现在有一个,但将来将超过1您使用的SQL RDBMS是什么?SQL Server、MySQL或Oracle等???您是否只对转换为字符串或如何从数据库检索下一个要使用的数字感兴趣。最好使用第二个选项@Steven您是否有许多用户同时将发票添加到数据库表中?现在有一个,但将来将超过1个使用MAX()聚合功能?@TaimurAdil:可以。或按顺序和限制。顺便说一句,不清楚您是将这些id表示为文本还是数字。这些id是有限的,所以我使用int表示that@JonSkeet使用MAX函数现在可能还可以,但随着表的增大,查询的开销会越来越大,依我拙见,序列对象将是一个更好的选择。对,因为1年后DB可能是MB或GB@M.Aliusing MAX()聚合函数?@TaimurAdil:可以。或按顺序和限制。顺便说一句,不清楚您是将这些id表示为文本还是数字。这些id是有限的,所以我使用int表示that@JonSkeet使用MAX函数现在可能还可以,但随着表的增大,查询的开销会越来越大,依我拙见,序列对象将是一个更好的选择。对,因为1年后DB可以是MB或GB@M。AliCache可能应该是1,以减少服务重新启动后因间隔而浪费的数字。应该注意的是,在回滚的情况下,序列中会出现间隔,这对于发票来说有时是不可接受的numberCache可能应为1,以减少服务重新启动后因间隙而浪费的数字。应注意,在回滚的情况下,序列中会出现间隙,这对于发票号来说有时是不可接受的
15080001
15080002
15080003
15080004
.......