2017-07-12 8 views
0

日付と行数を入力して自動インクリメント値を生成する関数を作成するには、次のコードを取得できました。しかし、私はそれをMySQLで実行することはできません。私は決して前にユーザー定義関数を作成することはありませんので、親切にコードを修正するのを助けてください。 (このコードは、MSSQLクエリから変換された)MySQLユーザー定義関数の自動インクリメント値を使用して日付


CREATE FUNCTION udf_ComputeColumn (p_id int, p_CreateDate date) 
RETURNS char(8) 
BEGIN 
    DECLARE v_revtal char(8); 
    DECLARE v_NumberOfRowsToday bigint; 

-- get the number of rows inserted in the same day before the current row 
SELECT COUNT(*) INTO v_NumberOfRowsToday 
FROM tickreqs 
WHERE createdate= p_CreateDate 
AND id < p_id; 

-- calculate the string to return 
SET v_revtal = DATE_FORMAT (p_CreateDate, 12) + RIGHT('0000' + 
CAST(v_NumberOfRowsToday as varchar(1)), 4); 
RETURN v_revtal; 

END; 

*表tickreqsは、IDカラムとCREATEDATE列を有します。

+1

理由だけではなく、これに代えて[AUTO_INCREMENT](https://dev.mysql.com/doc/refman/5.7/en/example-auto-increment.html)の列を持っていませんか? –

+0

日付に基づいて自動インクリメントが必要です。 20170001、20180001のように。AUTO_INCREMENTは増分をすべて維持します。 – Kakada

+0

[自動インクリメント - 毎年の自動リセット]の可能な複製(https://stackoverflow.com/questions/30167587/auto-increment-automatic-reset-for-each-year) –

答えて

0

以下のコードはそうで20170001 20170002として、あなたのコードを与えることとなります。


CREATE TRIGGER GenRequestCode BEFORE INSERT ON tickreqs FOR EACH ROW 
BEGIN 
    DECLARE v_NumberOfRowsToday BIGINT; 
    SELECT COUNT(*) INTO v_NumberOfRowsToday FROM tickreqs WHERE YEAR(createdate) = YEAR(NOW()); 
    SET NEW.requestcode = concat(YEAR(Now()), RIGHT(CONCAT('0000', 
CONVERt(v_NumberOfRowsToday + 1, CHAR)), 4)); 
END 
0

以下のコードは、仕事をやっているかもしれませんが、多分少し微調整してください。


CREATE TRIGGER GenRequestCode BEFORE INSERT ON tickreqs FOR EACH ROW 
BEGIN 
    SET NEW.codeyear = YEAR(NOW()); 
    SET NEW.requestcode = (SELECT IFNULL(MAX(requestcode) , 0) + 1 FROM tickreqs WHERE codeyear=YEAR(NOW())); 
END 
関連する問題