SQL server中按年月日生成日期型自增编码

[ 来源:http://www.it55.com | 作者: | 时间:2007-09-07 | 收藏 | 推荐 ] 【

以下为实现SQL server中按年月日生成日期型自增编码的sql脚本: 免费设计素材下载http://www.it55.com

/*
 * 测试表
*/
CREATE TABLE [dbo].[CustomIDTest] (
    [ID] [int] NOT NULL ,
    [Code] [char] (8) NOT NULL
)

免费矢量图片素材下载http://www.it55.com

/**//*
 * 功能:按 YYYYxxxx 格式生成目标年份的最大编码,数据类型为 CHAR(8)
 * 说明:特定表范围内有效
 *       未处理溢出情况(当表中某年值已达到YYYY9999)
*/
CREATE FUNCTION dbo.GenCustomCode(
    @Year INT
)
RETURNS CHAR(8)
AS
    BEGIN http://www.it55.com在线教程

        DECLARE
            @Code CHAR(8),
            @MinCodeInYear CHAR(8),
            @MaxCodeInYear CHAR(8)

http://www.it55.com在线教程

        SELECT @MinCodeInYear = CONVERT(CHAR(4), @Year) + '0001', @MaxCodeInYear = CONVERT(CHAR(4), @Year) + '9999'
       
        SELECT @Code = MAX(Code) FROM CustomIDTest WHERE Code >= @MinCodeInYear AND Code <= @MaxCodeInYear
        IF @Code IS NOT NULL AND @Year = CONVERT(INT, SUBSTRING(@Code, 1, 4))
            /**//*IF @Code = @MaxCodeInYear 溢出处理*/           
            SET @Code = CONVERT(INT, @Code) + 1
        ELSE
             SET @Code = @MinCodeInYear

sflj http://www.it55.com kg^&fgd

   
        RETURN @Code vd;k;l http://www.it55.com rdfg

    END

it55.com

/**//*
 * 功能:按 YYYYxxxx 格式生成目标年份的最大ID,数据类型为 INT
 * 说明:特定表范围内有效
 *       未处理溢出情况(当表中某年值已达到YYYY9999)
*/
CREATE FUNCTION dbo.GenCustomID(
    @Year INT
)
RETURNS INT
AS
    BEGIN 免费资源http://www.it55.com

        DECLARE
            @ID INT,
            @MinIDInYear INT,
            @MaxIDInYear INT

免费矢量图片素材下载http://www.it55.com

        SELECT @MinIDInYear = @Year*10000 + 1, @MaxIDInYear = @Year*10000 + 9999
       
        SELECT @ID = MAX(ID) FROM CustomIDTest WHERE ID >= @MinIDInYear AND ID <= @MaxIDInYear
        IF @ID IS NOT NULL AND @Year = @ID/10000
            /**//*IF @ID = @MaxIDInYear 溢出处理*/           
            SET @ID = @ID + 1
        ELSE
             SET @ID = @MinIDInYear
   
        RETURN @ID

vd;k;l http://www.it55.com rdfg

    END

sflj http://www.it55.com kg^&fgd

  http://www.it55.com在线教程

-- 测试
-- 自定义年份内自增
INSERT INTO CustomIDTest([ID], [Code])
SELECT dbo.GenCustomID(DatePart(YY, DATEADD(YY, -1, GetDate()))), dbo.GenCustomCode(DatePart(YY, DATEADD(YY, -1, GetDate())))
UNION
SELECT dbo.GenCustomID(DatePart(YY, GetDate())), dbo.GenCustomCode(DatePart(YY, GetDate()))
UNION
SELECT dbo.GenCustomID(DatePart(YY, DATEADD(YY, 1, GetDate()))), dbo.GenCustomCode(DatePart(YY, DATEADD(YY, 1, GetDate()))) 免费网页模版下载http://www.it55.com

SELECT * FROM CustomIDTest
结果
ID          Code    
----------- --------
20060001    20060001
20060002    20060002
20060003    20060003
20060004    20060004
20070001    20070001
20070002    20070002
20070003    20070003
20070004    20070004
20080001    20080001
20080002    20080002
20080003    20080003
20080004    20080004
说明:
1、对于此示例,一年内最大增量只有,9999,需要考虑溢出如何处理,此版本未处理
2、因此,根据实际需求,我们可以选择以“天”为编码前缀,并且扩大自增部分长度,避免溢出,
3、当然此时得考虑,使用 INT 型长度是否足够
4、此版本自定义函数,使用传入年份参数
5、若欲始终使用当前系统日期,而不显示指定年份,则需要建立一视图来获取当前日期(因SQLServer中标量函数,不能使用 GetDate() 这样的非标量函数)

(编辑:IT资讯之家 www.it55.com

返回顶部
共2页: 上一页 1 [2] 下一页  

网友评论

[以下评论为网友观点,不代表本站。请自觉遵守互联网相关政策法规,所有连带责任均有评论者自负。]
[不超过250字]