Мітка часу з точністю до мілісекунд: Як зберегти їх у MySQL


83

Мені потрібно розробити додаток, використовуючи MySQL, і я повинен зберегти значення типу "1412792828893", які представляють позначку часу, але з точністю до мілісекунд. Тобто кількість мілісекунд з 1.1.1970. Я оголошую рядок як, timestampале, на жаль, це не спрацювало. Для всіх значень встановлено значення0000-00-00 00:00:00

CREATE TABLE IF NOT EXISTS `probability` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`segment_id` int(11) NOT NULL,
`probability` float NOT NULL,
`measured_at` timestamp NOT NULL,
`provider_id` int(11) NOT NULL,
PRIMARY KEY (`id`)
) ;

Яким має бути оголошення, щоб можна було зберігати значення міток часу з такою точністю?


Яка версія MySQL?
Полуниця

mysql Ver 14.14 Distrib 5.6.11, для Win32 (x86)
Luixv

Схоже, вам пощастило.
Полуниця

У вас є значення в мілісекундах до вставки? Якщо так, чому б не зберігати безпосередньо як BIGINT?
Sandman

Відповіді:


139

Вам потрібно бути в MySQL версії 5.6.4 або пізнішої, щоб оголосити стовпці з дробово-типовими типами даних. Не впевнені, що у вас правильна версія? Спробуйте SELECT NOW(3). Якщо з’являється повідомлення про помилку, ви не маєте правильної версії.

Наприклад, DATETIME(3)дасть вам мілісекунду з роздільною здатністю у ваших позначках часу та TIMESTAMP(6)мікросекунду з позначкою часу у стилі * nix.

Прочитайте це: https://dev.mysql.com/doc/refman/8.0/en/fractional-seconds.html

NOW(3) надасть вам поточний час від операційної системи вашого сервера MySQL з точністю до мілісекунд.

Якщо у вас є кілька мілісекунд з епохи Unix , спробуйте це, щоб отримати значення DATETIME (3)

FROM_UNIXTIME(ms * 0.001)

Наприклад, мітки часу Javascript представлені в мілісекундах з часів Unix .

(Зверніть увагу, що внутрішня дробова арифметика, наприклад * 0.001, завжди обробляється як плаваюча крапка з подвійною точністю IEEE754, тому навряд чи ви втратите точність, поки Сонце не стане білою карликовою зіркою.)

Якщо ви використовуєте стару версію MySQL і вам потрібна допоточна точність часу, найкращий шлях - оновити. Все інше змусить вас робити безладні обхідні шляхи.

Якщо з якихось причин ви не можете оновити, ви можете розглянути можливість використання BIGINTабо DOUBLEстовпців для зберігання міток часу Javascript, як нібито це цифри. FROM_UNIXTIME(col * 0.001)все одно буде працювати нормально. Якщо вам потрібен поточний час для зберігання в такій колонці, ви можете використатиUNIX_TIMESTAMP() * 1000


Я змінив своє визначення на позначку часу (6), але при спробі додати значення за допомогою цього синтаксису ВСТАВИТИ У ВІДОМОСТЬ імовірності (виміряна_ат, імовірність, ідентифікатор_провайдера, сегмент_ід) ЗНАЧЕННЯ (1412877161519,0.7418073347680607,1,211623); Я все ще отримую 0000-00-00 00: 00: 00.00000 у стовпці "виміряно_на". Як мені вставити значення в цю таблицю?
Luixv,

1
@Luixv вам потрібно буде перетворити значення в дорозі: INSERT ... VALUES(FROM_UNIXTIME(0.001 * 1412877161519), 0.7418 ... );
Майкл - sqlbot

Помноження на 0,001 - порятунок! Я ніколи не міг здогадатися, що це спрацює, не втративши другої дроби. Дякую.
Павло Сергійович

У моєму випадку, оскільки я тестую з малиновим пі (і це дуже громіздко встановлювати mysql 5.6в RPI, я збираюся зберегти інформацію як час unix.
silgon

0

Ви можете використовувати BIGINT наступним чином:

CREATE TABLE user_reg (
user_id INT NOT NULL AUTO_INCREMENT,
identifier INT,
phone_number CHAR(11) NOT NULL,
verified TINYINT UNSIGNED NOT NULL,
reg_time BIGINT,
last_active_time BIGINT,
PRIMARY KEY (user_id),
INDEX (phone_number, user_id, identifier)
   );

Однак BIGINT - це 8 байт. Чи немає нічого ефективнішого? Це
S. Imp

0
CREATE TABLE fractest( c1 TIME(3), c2 DATETIME(3), c3 TIMESTAMP(3) );

INSERT INTO fractest VALUES
('17:51:04.777', '2018-09-08 17:51:04.777', '2018-09-08 17:51:04.777');
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.