如何在sql函数中获取年份

时间:2014-02-10 23:09:35

标签: sql tsql

我有一个以下函数来通过SQL服务器创建一个唯一的数字。

USE [icelandtaxitours_development]
GO
/****** Object:  UserDefinedFunction [dbo].[ufnInvoiceNumber]    Script Date: 10.2.2014 22:53:54 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

ALTER FUNCTION [dbo].[ufnInvoiceNumber](
    @Value int
) 
RETURNS varchar(6) 
WITH SCHEMABINDING 
AS 
BEGIN
    DECLARE @ReturnValue varchar(8);

    SET @ReturnValue = CONVERT(varchar(8), @Value);
    SET @ReturnValue = Year(Getdate()) + '-' + REPLICATE('0', 8 - DATALENGTH(@ReturnValue)) + @ReturnValue;

    RETURN (@ReturnValue);
END;

当我在公式中调用它时,我会执行以下操作:

(isnull([dbo].[ufnInvoiceNumber]([InvoiceID]),''))

...现在我只是得到一个数字“2015”..我想要的是一个数字“2014-00000001”作为发票号码。

有关如何完成此任务的任何建议?

2 个答案:

答案 0 :(得分:1)

服务器可能会对您是想要数字加法还是字符串连接感到困惑。为了安全起见,您可以将年份转换为字符串:

SET @ReturnValue = CONVERT(CHAR(4),Year(Getdate()))
                   + '-' 
                   + REPLICATE('0', 8 - DATALENGTH(@ReturnValue)) + @ReturnValue;

另外,您需要增加返回类型的长度:

RETURNS varchar(13) 

答案 1 :(得分:0)

我认为你想要的功能是:

ALTER FUNCTION [dbo].[ufnInvoiceNumber](
    @Value int
) 
RETURNS varchar(255) 
WITH SCHEMABINDING 
AS 
BEGIN
    DECLARE @ReturnValue varchar(255);

    SET @ReturnValue = CONVERT(varchar(8), @Value);
    SET @ReturnValue = cast(Year(Getdate()) as varchar(255)) + '-' + REPLICATE('0', 8 - LEN(@ReturnValue)) + @ReturnValue;

    RETURN (@ReturnValue);
END;

最重要的部分是将返回类型更改为varchar(),其大小足以容纳您想要的值并更改代码中@ReturnValue的相应类型。我还为今年添加了一个明确的演员,以避免数据错误,并将datalength()替换为len(),因为您正在处理一个简单的字符串。

其实我更喜欢把身体写成:

    SET @ReturnValue = (cast(Year(Getdate() as varchar(255)) + '-' +
                        LEFT(REPLICATE('0', 8) + cast(@value as varchar(8)), 8
                       );    
    RETURN (@ReturnValue);