밀리 초 정밀도의 타임 스탬프 : 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?
Strawberry

MySQL의 버전 14.14 DISTRIB 5.6.11, Win32에서 (86)에 대한
Luixv

운이 좋은 것 같습니다.
Strawberry

삽입하기 전에 밀리 초 단위의 값이 있습니까? 그렇다면 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 epoch 이후 밀리 초가 지난 경우 DATETIME (3) 값을 얻으려면 이것을 시도하십시오.

FROM_UNIXTIME(ms * 0.001)

예를 들어 자바 스크립트 타임 스탬프Unix epoch 이후 밀리 초 단위로 표시됩니다 .

(와 같은 MySQL 내부 분수 산술 * 0.001은 항상 IEEE754 배정 밀도 부동 소수점으로 처리되므로 태양이 백색 왜성이되기 전에 정밀도를 잃지 않을 가능성이 높습니다.)

이전 버전의 MySQL을 사용하고 있고 1 초 미만의 정밀도가 필요한 경우 가장 좋은 방법은 업그레이드하는 것입니다. 다른 것들은 당신이 지저분한 해결 방법을하도록 강요 할 것입니다.

어떤 이유로 업그레이드 할 수없는 경우 BIGINT또는 DOUBLE열을 사용하여 Javascript 타임 스탬프를 숫자처럼 저장하는 것을 고려할 수 있습니다. FROM_UNIXTIME(col * 0.001)여전히 정상적으로 작동합니다. 이러한 열에 저장할 현재 시간이 필요하면 다음을 사용할 수 있습니다.UNIX_TIMESTAMP() * 1000


내 정의를 timestamp (6)로 변경했지만이 구문을 사용하여 값을 추가하려고 할 때 INSERT INTO 확률 (measured_at, chance, provider_id, segment_id) VALUES (1412877161519,0.7418073347680607,1,211623); 여전히 "measured_at"열에 0000-00-00 00 : 00 : 00.00000이 표시됩니다. 이 테이블에 값을 어떻게 삽입해야합니까?
Luixv 2014

1
@Luixv 당신은 도중에 값을 변환해야 할 것입니다 : INSERT ... VALUES(FROM_UNIXTIME(0.001 * 1412877161519), 0.7418 ... );
Michael-sqlbot

0.001을 곱하면 생명의 은인입니다! 나는 그것이 두 번째 분수를 잃지 않고 작동 할 것이라고 생각할 수 없었다. 감사합니다.
Pavel S.

제 경우에는 라즈베리 파이로 테스트하고 있기 때문에 ( mysql 5.6RPI 에 설치하는 것이 정말 번거롭기 때문에 정보를 유닉스 시간으로 절약 할 것입니다.
silgon aug

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. 임프

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');
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.