Muszę opracować aplikację przy użyciu MySQL i zapisać wartości takie jak „1412792828893”, które reprezentują znacznik czasu, ale z dokładnością do milisekundy. To znaczy ilość milisekund od 1.1.1970. Deklaruję wiersz jako, timestamp
ale niestety to nie zadziałało. Wszystkie wartości są ustawione na0000-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`)
) ;
Jak powinna wyglądać deklaracja, aby móc zapisywać wartości znaczników czasu z taką dokładnością?
mysql
datetime
timestamp
milliseconds
Luixv
źródło
źródło
Odpowiedzi:
Musisz być w MySQL w wersji 5.6.4 lub nowszej, aby zadeklarować kolumny z typami danych ułamkowymi sekundami. Nie jesteś pewien, czy masz odpowiednią wersję? Spróbuj
SELECT NOW(3)
. Jeśli pojawi się błąd, oznacza to, że nie masz odpowiedniej wersji.Na przykład,
DATETIME(3)
da ci rozdzielczość milisekundową w twoich znacznikach czasu iTIMESTAMP(6)
da ci rozdzielczość mikrosekundową na znaczniku czasu w stylu * nix.Przeczytaj to: https://dev.mysql.com/doc/refman/8.0/en/fractional-seconds.html
NOW(3)
poda aktualny czas z systemu operacyjnego serwera MySQL z dokładnością do milisekund.Jeśli masz pewną liczbę milisekund od epoki Uniksa , spróbuj tego, aby uzyskać wartość DATETIME (3)
Na przykład sygnatury czasowe JavaScript są przedstawiane w milisekundach od czasu wprowadzenia epoki Uniksa .
(Zauważ, że wewnętrzna arytmetyka ułamkowa MySQL, na przykład
* 0.001
, jest zawsze traktowana jako zmiennoprzecinkowa podwójnej precyzji IEEE754, więc jest mało prawdopodobne, że stracisz precyzję, zanim Słońce stanie się gwiazdą białego karła.)Jeśli używasz starszej wersji MySQL i potrzebujesz dokładności co do sekundy, najlepszą drogą jest aktualizacja. Cokolwiek innego zmusi Cię do wykonania niechlujnych obejść.
Jeśli z jakiegoś powodu nie możesz uaktualnić, możesz rozważyć użycie kolumn
BIGINT
lubDOUBLE
do przechowywania znaczników czasu JavaScript tak, jakby były liczbami.FROM_UNIXTIME(col * 0.001)
nadal będzie działać OK. Jeśli potrzebujesz aktualnego czasu do przechowywania w takiej kolumnie, możesz użyćUNIX_TIMESTAMP() * 1000
źródło
INSERT ... VALUES(FROM_UNIXTIME(0.001 * 1412877161519), 0.7418 ... );
mysql 5.6
w RPI jest naprawdę uciążliwa , zamierzam zapisać informacje jako czasMożesz użyć BIGINT w następujący sposób:
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) );
źródło
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');
źródło