एक मिलीसेकंड परिशुद्धता के साथ टाइमस्टैम्प: उन्हें 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 का क्या संस्करण?
स्ट्रॉबेरी

Mysql Ver 14.14 डिस्ट्रीब्यूट 5.6.11, Win32 (x86) के लिए
लुइक्विस

लगता है तुम किस्मत में हो।
स्ट्रॉबेरी

क्या आपके पास प्रविष्टि से पहले मिलीसेकंड के रूप में हाथ में मूल्य हैं? यदि हां, तो BIGINT के रूप में सीधे स्टोर क्यों नहीं किया जाता है?
सैंडमैन

जवाबों:


139

आपको MySQL संस्करण 5.6.4 पर या बाद में आंशिक-दूसरी बार डेटाटाइप के साथ कॉलम घोषित करने की आवश्यकता है। निश्चित नहीं है कि आपके पास सही संस्करण है? कोशिश करो SELECT NOW(3)। यदि आपको कोई त्रुटि मिलती है, तो आपके पास सही संस्करण नहीं है।

उदाहरण के लिए, DATETIME(3)आपको अपने टाइमस्टैम्प में मिलीसेकंड रिज़ॉल्यूशन TIMESTAMP(6)देगा , और आपको * निक्स-स्टाइल टाइमस्टैम्प पर माइक्रोसेकंड रिज़ॉल्यूशन देगा।

इसे पढ़ें: https://dev.mysql.com/doc/refman/8.0/en/fractional-seconds.html

NOW(3) मिलिसेकंड परिशुद्धता के साथ आपके MySQL सर्वर के ऑपरेटिंग सिस्टम से आपको वर्तमान समय देगा।

यदि आपके पास यूनिक्स युग के बाद से कई मिलीसेकंड हैं , तो DATETIME (3%) मान प्राप्त करने के लिए इसे आज़माएं

FROM_UNIXTIME(ms * 0.001)

उदाहरण के लिए, जावास्क्रिप्ट टाइमस्टैम्प को यूनिक्स युग के बाद से मिलीसेकंड में दर्शाया गया है ।

(ध्यान दें कि MySQL आंतरिक आंशिक अंकगणितीय, जैसे * 0.001, हमेशा IEEE754 डबल सटीक फ़्लोटिंग पॉइंट के रूप में संभाला जाता है, इसलिए यह संभावना नहीं है कि सूर्य के सफेद बौने स्टार बनने से पहले आप सटीक खो देंगे।)

यदि आप MySQL के पुराने संस्करण का उपयोग कर रहे हैं और आपको उप-समय सटीक की आवश्यकता है, तो आपका सबसे अच्छा तरीका अपग्रेड करना है। और कुछ भी आपको गन्दा काम करने के लिए मजबूर करेगा।

यदि, किसी कारण से आप अपग्रेड नहीं कर सकते हैं, तो आप जावास्क्रिप्ट टाइमस्टैम्प को स्टोर करने के लिए कॉलम BIGINTया DOUBLEकॉलम का उपयोग करने पर विचार कर सकते हैं जैसे कि वे संख्याएं थीं। FROM_UNIXTIME(col * 0.001)अभी भी ठीक काम करेगा। यदि आपको ऐसे कॉलम में स्टोर करने के लिए वर्तमान समय की आवश्यकता है, तो आप उपयोग कर सकते हैंUNIX_TIMESTAMP() * 1000


मैंने अपनी परिभाषा को टाइमस्टैम्प (6) में बदल दिया है, लेकिन जब इस सिंटैक्स INSERT INTO प्रायिकता (मापा_at, प्रायिकता, प्रोवाइडर_ड, सेगमेंट_आईडी) वैल्यू (141287716151919,0418073378047680607,1,211623) का उपयोग करके मूल्यों को जोड़ने की कोशिश की जा रही है; मुझे अभी भी "मेजरमेंट" कॉलम पर 0000-00-00 00: 00: 00.00000 मिलते हैं। मुझे इस तालिका में मान कैसे सम्मिलित करने चाहिए?
लुइक्विस

1
@ लिक्सव आपको इस तरह से मान को परिवर्तित करने की आवश्यकता होगी: INSERT ... VALUES(FROM_UNIXTIME(0.001 * 1412877161519), 0.7418 ... );
माइकल - sqlbot

0.001 से गुणा करना एक लाइफसेवर है! मैं कभी अनुमान नहीं लगा सकता था कि यह दूसरे हिस्से को खोए बिना काम करेगा। धन्यवाद।
पावेल एस।

मेरे मामले में, जब से मैं एक रास्पबेरी पाई के साथ परीक्षण कर रहा हूं (और mysql 5.6आरपीआई में स्थापित करना वास्तव में बोझिल है , मैं जानकारी को यूनिक्स समय बचाने के साथ जा रहा हूं।
सिलगॉन

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

एक बड़ा 8 बाइट्स है, हालांकि। क्या अधिक कुशल कुछ नहीं है? आप की जरूरत के मुकाबले प्रति रिकॉर्ड दो बाइट्स की तरह है
एस। इम्प

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');
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.