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


РЕДАКТИРОВАТЬ:

Учти это:

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


person Please_Dont_Bully_Me_SO_Lords    schedule 20.03.2013    source источник
comment
Эта ошибка исправлена ​​в версии MySQL 5.6.4. Какая у вас версия?   -  person Matt Busche    schedule 20.03.2013
comment
Я использую HostGator.com, который использует MySQL 5.5.21, как указано в support.hostgator.com/articles/hosting-guide/hardware-software/   -  person Please_Dont_Bully_Me_SO_Lords    schedule 20.03.2013
comment
Моя локальная версия MySQL — 5.1.5 от Zend Server 5 CE.   -  person Please_Dont_Bully_Me_SO_Lords    schedule 20.03.2013


Ответы (5)


MySQL 5.6 поддерживает точность в миллисекундах в sysdate функция.

пытаться

select sysdate(6) вернется 2013-04-16 13:47:56.273434

а также

select sysdate(3) вернется 2013-04-16 13:47:56.273

person ali    schedule 16.04.2013
comment
для MySQL 5.6.4 и более поздних версий, согласно документации (dev.mysql.com/doc/refman/5.6/en/) - person bitsoflogic; 18.04.2014

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

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

person artahian    schedule 20.03.2013
comment
5.1 могу сказать, что. 5.6 тоже говорит об этом, но расширяет этот вопрос в некоторых важных аспектах, поэтому решающий вопрос: «Какую версию использует ОП?» - person Strawberry; 20.03.2013
comment
Я не ищу хранилище, а просто извлекаю из системы текущую дату и время, как указано в вопросе. Я сохраню его как строковое значение YYYYMMDDHHMMSSZZZ. - person Please_Dont_Bully_Me_SO_Lords; 20.03.2013
comment
Если ваша версия MySQL недостаточно нова, она не сможет получить любую часть меньше 1 секунды. Лучше использовать язык сценариев на стороне сервера, чтобы получить его, а затем ввести запрос. - person artahian; 20.03.2013
comment
Так что я не смогу создать эту хранимую функцию :-( - person Please_Dont_Bully_Me_SO_Lords; 20.03.2013

Для майскл 5.6

round(unix_timestamp() * 1000  + MICROSECOND(sysdate(6)) / 1000)
person javamonk    schedule 10.11.2014
comment
У меня отлично работает на 5.6.32. - person Ethan Allen; 21.09.2017

Также вы можете

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)
person http8086    schedule 10.12.2019

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

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

CREATE TABLE time_test (id INT NOT NULL AUTO_INCREMENT, start_time TEXT NULL, stop_time TEXT NULL, difference TEXT NULL, ranking INT NULL, PRIMARY KEY (id))

INSERT INTO time_test VALUES (NULL, '10:10:10.111111', '10:10:10.456789',NULL,NULL) INSERT INTO time_test VALUES (NULL, '10:10:10.111111', '10:10:20.777777', NULL, NULL) INSERT INTO time_test VALUES (NULL, '10:10:10.111111', '10:10:01.999999',NULL,NULL)

Теперь вы можете рассчитать так Теперь вы можете рассчитать так сортировка SELECT * FROM time_test ORDER ПО ВРЕМЕНИ(время остановки)

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

также может вычислить и сохранить обратно, вы можете отрезать строку самостоятельно. update time_test установить разницу = concat (TIMEDIFF (время остановки, время начала), MICROSECOND (TIMEDIFF (время остановки, время начала))) также можно вычислить и сохранить, вы можете вырезать какую-то строку самостоятельно.

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

person Sueb Tarasiri    schedule 12.09.2018