Как получить микросекунды или миллисекунды от текущего времени 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 (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.
поэтому вам нужно сохранить его не как значение даты, а как простое значение с плавающей запятой.
это мое решение для управления миллисекунды.
я просто использую тип данных "текст" в качестве хранилища данных, потому что вы должны контролировать проверку данных самостоятельно.
СОЗДАТЬ ТАБЛИЦУ 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;
вы также делаете рейтинг по этому команда: