2014-10-10 16 views
37

Tôi phải phát triển một ứng dụng bằng MySQL và tôi phải lưu các giá trị như "1412792828893" biểu thị dấu thời gian nhưng với độ chính xác là mili giây. Tức là, số lượng mili giây kể từ 1.1.1970. Tôi tuyên bố hàng là timestamp nhưng tiếc là điều này không hoạt động. Tất cả các giá trị được đặt thành 0000-00-00 00:00:00Dấu thời gian có độ chính xác mili giây: Cách lưu chúng trong 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`) 
) ; 

Làm cách nào để khai báo để có thể lưu giá trị dấu thời gian với độ chính xác này?

+0

Phiên bản nào của MySQL? – Strawberry

+0

mysql Ver 14,14 Distrib 5.6.11, cho Win32 (x86) – Luixv

+0

Có vẻ như bạn đang gặp may. – Strawberry

Trả lời

62

Bạn cần phải có phiên bản MySQL 5.6.4 trở lên để khai báo các cột có kiểu dữ liệu thời gian phân đoạn thứ hai. Bạn không chắc mình có phiên bản đúng không? Hãy thử SELECT NOW(3). Nếu bạn gặp lỗi, bạn không có phiên bản phù hợp.

Ví dụ: DATETIME(3) sẽ cho bạn độ phân giải milli giây trong dấu thời gian của bạn và TIMESTAMP(6) sẽ cho bạn độ phân giải micro giây trên dấu thời gian * nix.

đọc này: http://dev.mysql.com/doc/refman/5.7/en/fractional-seconds.html

NOW(3) sẽ cung cấp cho bạn thời điểm hiện tại từ hệ điều hành máy chủ MySQL của bạn với độ chính xác phần nghìn giây.

Nếu bạn có một số mili giây kể từ khi Unix epoch, hãy thử này để có được một DATETIME (3) giá trị

FROM_UNIXTIME(ms * 0.001) 

Javascript timestamps, ví dụ, được trình bày trong mili giây kể từ khi Unix epoch.

(Chú ý rằng MySQL nội bộ số học phân đoạn, như * 0.001, luôn luôn xử lý như IEEE754 độ chính xác gấp đôi dấu chấm động, do đó, nó không bạn sẽ bị mất độ chính xác trước khi mặt trời trở thành một sao lùn trắng.)

Nếu bạn' tái sử dụng một phiên bản cũ của MySQL và bạn cần độ chính xác thời gian thứ hai, con đường tốt nhất của bạn là nâng cấp. Bất cứ điều gì khác sẽ buộc bạn vào cách giải quyết lộn xộn.

Nếu vì một số lý do bạn không thể nâng cấp, bạn có thể xem xét sử dụng các cột BIGINT hoặc DOUBLE để lưu dấu thời gian Javascript như thể chúng là số. FROM_UNIXTIME(col * 0.001) sẽ vẫn hoạt động OK. Nếu bạn cần thời gian hiện tại để lưu trữ trong cột như vậy, bạn có thể sử dụng UNIX_TIMESTAMP() * 1000

+0

Tôi đã thay đổi định nghĩa của mình thành dấu thời gian (6) nhưng khi cố gắng thêm giá trị bằng cú pháp này xác suất INSERT INTO (measur_at, probability, provider_id, segment_id) (1412877161519,0.7418073347680607,1,211623); Tôi vẫn nhận được 0000-00-00 00: 00: 00.00000 tại cột "measured_at". Tôi nên chèn các giá trị vào bảng này như thế nào? – Luixv

+1

@ Luixv bạn sẽ cần phải chuyển đổi giá trị trên đường vào: 'INSERT ... VALUES (FROM_UNIXTIME (0,00118 1412877161519), 0,7418 ...); ' –

+0

Nhân với 0,001 là một phao cứu sinh! Tôi không bao giờ có thể đoán nó sẽ làm việc mà không mất phần thứ hai. Cảm ơn bạn. –

Các vấn đề liên quan