Как получить микросекунды или миллисекунды от текущего времени MySQL?

Я пытаюсь создать свою первую сохраненную функцию на 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, что я хочу знать микросекунды текущего времени?


EDIT:

рассмотрим следующий пример:

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 и вставьте это в нединамический выбор, чтобы получить миллисекунду последней записи этой таблицы...

4 ответов


MySQL 5.6 поддерживает точность миллисекунды в sysdate


взгляните на то, что говорит 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.

поэтому вам нужно сохранить его не как значение даты, а как простое значение с плавающей запятой.


для mysql 5.6

round(unix_timestamp() * 1000  + MICROSECOND(sysdate(6)) / 1000)

это мое решение для управления миллисекунды.

я просто использую тип данных "текст" в качестве хранилища данных, потому что вы должны контролировать проверку данных самостоятельно.

СОЗДАТЬ ТАБЛИЦУ time_test ( id INT НЕ NULL AUTO_INCREMENT , start_time ТЕКСТ NULL , stop_time ТЕКСТ NULL , difference ТЕКСТ NULL , ranking INT NULL , ПЕРВИЧНЫЙ КЛЮЧ (id ) )

ВСТАВИТЬ В time_test ЗНАЧЕНИЯ (NULL, '10:10:10.111111', '10:10:10.456789',NULL, NULL) ВСТАВИТЬ В time_test ЗНАЧЕНИЯ (NULL, '10:10:10.111111', '10:10:20.777777',NULL, NULL) ВСТАВИТЬ В time_test ЗНАЧЕНИЯ (NULL, '10:10:10.111111', '10:10:01.999999',NULL, NULL)

теперь вы можете рассчитать, как это Теперь вы можете рассчитать, как это рассортировать ВЫБЕРИТЕ * FROM time_test заказать по времени (stop_time )

рассчитать разницу во времени, очень хорошо для меня. Выберите *, TIMEDIFF (stop_time,start_time) из time_test
рассчитать разницу во времени, очень хорошо для мне.

также можно калькулировать и хранить обратно вы можете вырезать строку самостоятельно. update time_test set difference = concat (TIMEDIFF (stop_time, start_time), микросекунда (TIMEDIFF (stop_time, start_time) )) также можно калькулировать и хранить обратно вы можете вырезать строку самостоятельно.

вы также делаете рейтинг по этой команде: SET @r:=0;
UPDATE time_test установить рейтинг= (@r:= (@r+1)) порядок по difference ASC; вы также делаете рейтинг по этому команда: