【问题标题】:How to create SQL Function that fill the field with increment如何创建用增量填充字段的 SQL 函数
【发布时间】:2015-10-30 03:30:32
【问题描述】:

我有一个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

该代码返回连续增量。

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

【问题讨论】:

  • 一次生成这个比多次调用函数更好。
  • 你能做示例查询吗?感谢您的建议:)
  • 所以当您开始时ticket_number 字段为空?
  • 是的,这取决于日期。所以我有存储过程来首先填写日期。然后我调用函数来获取ticket_number
  • 你正在按顺序从桌子上拿走所有的票。你需要把... from transaksi where date = @date放在那里。

标签: sql sql-server


【解决方案1】:

这样的事情怎么样:

  • 单个查询中的所有刻度。只需添加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 |

【讨论】:

  • 哇,太好了。但是,我需要一个函数的输出。这个案例是我讲座中提出的问题之一。
  • 检查HERE如何创建返回表的函数
  • 您还没有接受任何答案。你还有这个问题吗?
【解决方案2】:

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 

【讨论】:

  • 此查询返回:Msg 243, Level 16, State 1, Line 2 Type DATE 不是定义的系统类型。
  • @FregyDamara:请检查 SQL Fiddle。
【解决方案3】:

试试这个,

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)

【讨论】:

    猜你喜欢
    • 2013-08-11
    • 1970-01-01
    • 1970-01-01
    • 2016-02-19
    • 2021-12-22
    • 2012-07-04
    • 1970-01-01
    • 1970-01-01
    • 2015-03-06
    相关资源
    最近更新 更多