MySQLで最初のストアド関数を作成しようとしています。この関数では、次のように3マイクロ秒の数字で現在の日付と時刻のタイムスタンプを返します。YYYYMMDDHHMMSSZZZ
データベースでこの番号を使用して、オフラインでレコードの一意のキーを作成し、システムが異なるオフラインサーバーのデータベースをマージするときにそれらがクラッシュしないようにします。
だから私が最初に試したのはSELECT CAST(MICROSECOND(NOW()) AS CHAR(3));
でした
ただし、0を返します。
SELECT CAST(MICROSECOND('2009-12-31 23:59:59.001210') AS CHAR(3));
を試してみると
必要に応じて121を返します。
では、MySQLに現在のマイクロ秒を知りたいことを伝える方法は?
編集:
このことを考慮:
CREATE FUNCTION CHAVE (pTable VARCHAR(32)) RETURNS CHAR(20)
BEGIN
DECLARE vSigla CHAR(3);
DECLARE vDateTime CHAR(14);
DECLARE vMilli CHAR(3);
DECLARE vKey CHAR(20);
SET vSigla = (SELECT SIGLA FROM TABLELIST WHERE NOME = pTable);
SET vDateTime = (SELECT CAST(LEFT(UTC_TIMESTAMP()+0, 14) AS CHAR(14)));
SET vMilli = LPAD(FLOOR(Rand() * 1000), 3, '0');
SET vKey = CONCAT(vSigla, vDateTime, vMilli);
RETURN vKey;
END;
結果として:
INSERT INTO TABLEX (dateID, name) VALUES (CHAVE('TABLEX'), 'EASI');
CHAVE( 'TABLEX')から:
KEY20130320151159666
666は乱数になりますが、ただし、現在の時刻の実際のミリ秒数であるといいのですがなので、重複するキーはありません。
SHOW COLUMNS FROM @TableName WHERE FIELD_NAME LIKE '%_ID' LIMIT 1
そしてそれを非動的SELECTに挿入して、そのテーブルの最後のレコードのミリ秒を取得します。
MySQL 5.6は sysdate
関数でミリ秒の精度をサポートしています。
試す
select sysdate(6)
は_2013-04-16 13:47:56.273434
_を返します
そして
select sysdate(3)
は_2013-04-16 13:47:56.273
_を返します
MySQLの内容を見てください( http://dev.mysql.com/doc/refman/5.1/en/fractional-seconds.html ):
However, when MySQL stores a value into a column of any temporal data type, it discards any fractional part and does not store it.
したがって、日付値としてではなく、単純な浮動小数点値として保存する必要があります。
Mysql5.6の場合
round(unix_timestamp() * 1000 + MICROSECOND(sysdate(6)) / 1000)
また、あなたはすることができます
mysql> select now(3) as millisecond, now(6) as microsecond, round(1000 * unix_timestamp(now(3))) elapsed_millisecond, round(unix_timestamp() * 1000 + MICROSECOND(now(6)) / 1000) elapsed_microsecond;
+-------------------------+----------------------------+---------------------+---------------------+
| millisecond | microsecond | elapsed_millisecond | elapsed_microsecond |
+-------------------------+----------------------------+---------------------+---------------------+
| 2019-12-10 11:49:43.568 | 2019-12-10 11:49:43.568767 | 1575949783568 | 1575949783569 |
+-------------------------+----------------------------+---------------------+---------------------+
1 row in set (0.01 sec)