2014-10-10 1 views
37

MySQL을 사용하여 응용 프로그램을 개발해야하며 타임 스탬프를 나타내는 밀리 초 단위의 정밀도를 나타내는 값 "1412792828893"을 저장해야합니다. 즉, 1.1.1970 년 이후의 시간 (밀리 초)입니다. 나는 행을 timestamp으로 선언하지만 불행히도 이것은 작동하지 않습니다. 모든 값은 어떻게 정밀 타임 스탬프 값을 저장 할 수 있도록하기 위해 선언해야 0000-00-00 00:00:00밀리 초 정밀도의 타임 스탬프 : MySQL에 저장하는 방법

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`) 
) ; 

로 설정?

+0

어떤 버전의 MySQL을 사용할 수 있습니까? – Strawberry

+0

MySQL 버전 14.14 배포판 5.6.11, Win32 (x86) – Luixv

+0

당신은 운이 좋은 것 같습니다. – Strawberry

답변

62

분수 초의 시간 데이터 형식으로 열을 선언하려면 MySQL 버전 5.6.4 이상이어야합니다. 올바른 버전을 가지고 있는지 확실하지 않습니까? 시도하십시오 SELECT NOW(3). 오류가 발생하면 올바른 버전이 제공되지 않습니다.

예를 들어, DATETIME(3)은 타임 스탬프에서 밀리 초 해상도를 제공하고 TIMESTAMP(6)은 * nix 스타일 타임 스탬프에서 마이크로 초 해상도를 제공합니다.

이 읽기 ​​: http://dev.mysql.com/doc/refman/5.7/en/fractional-seconds.html

NOW(3)이 밀리 초 정밀도와 MySQL 서버의 운영 체제에서 당신에게 현재 시간을 줄 것이다.

당신이 Unix epoch 밀리 세컨드의 번호가있는 경우, 예를 들어, Unix epoch 이후 밀리 초 단위로 표시됩니다, 날짜 시간 (3) 값

FROM_UNIXTIME(ms * 0.001) 

Javascript timestamps 얻기 위해 이것을 시도.

(는 태양이 백색 왜성 스타가되기 전에 당신이 정밀도를 잃게 될 가능성이 그래서 MySQL의 내부 분수 산술, * 0.001처럼, 항상, IEEE754 배정 밀도 부동 소수점으로 처리되는 것을 알 수 있습니다.)

당신이 만약 ' 이전 버전의 MySQL을 사용하고 있으며 2 초 미만의 정밀도가 필요합니다. 가장 좋은 방법은 업그레이드하는 것입니다. 다른 것은 당신을 어리석은 해결 방법을 강요합니다.

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

+0

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

+1

@Luixv 'INSERT ... VALUES (FROM_UNIXTIME (0.001 * 1412877161519), 0.7418 ...);' –

+0

0.001을 곱하면 값을 변환해야합니다! 나는 두 번째 부분을 잃지 않고 작동 할 것이라고 결코 추측 할 수 없었다. 고맙습니다. –