如何创建用增量填充字段的SQL函数

时间:2015-10-30 03:30:33

标签: sql sql-server

我有一张tickets的表格,其中包含名为ticket_numberdate的列,其中包含创建日期。

该表中的数据:

ticket_number   |   date 
150910.001          2015/09/10 
150910.002          2015/09/10 
150911.001          2015/09/11 
150911.002          2015/09/11 
150911.003          2015/09/11 

我想创建一个基于日期创建ticket_number的SQL函数。如果日期不同,则最后3位数字再次重置为001。

我在编写SQL查询时无法返回此类信息。

到目前为止,我已经尝试过:

    CREATE FUNCTION FcNoTicket(@date as datetime)
    RETURNS CHAR(10)
    AS
    BEGIN
        DECLARE @newNumber char(10),@date_k char(7), @ticketNo as int
        SELECT @date_k =    RIGHT(Year(@date),2)+RIGHT('00'+CONVERT(NVARCHAR(2),DATEPART(MONTH,@date)),2)
    +RIGHT('00'+CONVERT(NVARCHAR(2),DATEPART(day,@date)),2)+'.' from tickets
        SELECT @ticketNo=ROW_NUMBER() OVER(PARTITION BY @date ORDER BY @date)
    from ticket
        SET @newNumber=@date_k+right('00'+cast(@ticketNo+1 as varchar(3)),3)
    RETURN @newNumber
END

该代码返回连续增量。

有没有人对如何做到这一点有任何想法?

3 个答案:

答案 0 :(得分:3)

这样的事情:

  • 单个查询中的所有标记。只需添加Create table AS
  • 即可

SqlFiddle Demo

WITH tickets as (
    SELECT [date], 
           row_number() over( partition by [date] order by [date]) as rn
    FROM YourTable
)
SELECT [date],  RIGHT(Year([date]),2)
              + RIGHT('00' + CONVERT(NVARCHAR(2),DATEPART(MONTH,[date])),2)
              + RIGHT('00' + CONVERT(NVARCHAR(2),DATEPART(DAY  ,[date])),2)
              + '.'
              + RIGHT('000'+ CONVERT(NVARCHAR(3), rn), 3) as ticket_id
FROM tickets

<强>输出

|                        date |  ticket_id |
|-----------------------------|------------|
| September, 10 2015 00:00:00 | 150910.001 |
| September, 10 2015 00:00:00 | 150910.002 |
| September, 11 2015 00:00:00 | 150911.001 |
| September, 11 2015 00:00:00 | 150911.002 |
| September, 11 2015 00:00:00 | 150911.003 |

答案 1 :(得分:0)

SQL Fiddle

SELECT Replace(CONVERT(VARCHAR, ydate, 11), '/', '') 
       + '.' 
       + RIGHT('000'+Cast(Row_number() OVER(partition BY ydate 
                                            ORDER BY ydate)
                          AS VARCHAR(10)), 3) RN, 
       ydate 
FROM   yourtable 

答案 2 :(得分:0)

试试这个,

DECLARE @t TABLE (
    ticket_number VARCHAR(20)
    ,ticketdate DATE
    )

INSERT INTO @t
VALUES ('150910.001','2015/09/10'),('150910.002','2015/09/10')
    ,('150911.001','2015/09/11'),('150911.002','2015/09/11')
    ,('150911.003','2015/09/11')

--select * from @t
DECLARE @ParameterDate DATETIME = '2015/10/11' -- input of UDF
DECLARE @ticket INT
DECLARE @i INT = 3 --how many zero to replicate

SELECT @ticket = max(SUBSTRING(ticket_number, CHARINDEX('.', ticket_number) + 1, len(ticket_number) 
- CHARINDEX('.', ticket_number)))
FROM @t
WHERE ticketdate = @ParameterDate

SET @ticket = isnull(@ticket, 0) + 1

--return this result from function
SELECT stuff(convert(VARCHAR(8), @ParameterDate, 112), 1, 2, '') + replicate('0', @i
 - len(@ticket)) + cast(@ticket AS VARCHAR)