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 버전 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
답변
다음과 같이 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)
);
답변
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');