सकलाइट: CURRENT_TIMESTAMP GMT में है, मशीन का टाइमज़ोन नहीं


118

मेरे पास एक कॉलम (v3) तालिका है जिसमें इस स्तंभ की परिभाषा है:

"timestamp" DATETIME DEFAULT CURRENT_TIMESTAMP

यह डेटाबेस जिस सर्वर पर रहता है वह CST टाइम ज़ोन में है। जब मैं टाइमस्टैम्प कॉलम को शामिल किए बिना अपनी तालिका में सम्मिलित करता हूं, तो sqlite स्वचालित रूप से GMT में वर्तमान टाइमस्टैम्प के साथ उस क्षेत्र को पॉपुलेट करता है, न कि सीएसटी।

क्या स्टोरेज टाइमस्टैम्प को सीएसटी में रखने के लिए मजबूर करने के लिए मेरे सम्मिलित विवरण को संशोधित करने का कोई तरीका है? दूसरी ओर, संभवतः इसे जीएमटी में संग्रहीत करना बेहतर होता है (उदाहरण के लिए डेटाबेस अलग-अलग समयक्षेत्र में स्थानांतरित हो जाता है, उदाहरण के लिए), तो क्या कोई तरीका है जब मैं संग्रहीत टाइमस्टैम्प को सीएसटी में बदलने के लिए अपने चुनिंदा एसक्यूएल को संशोधित कर सकता हूं जब मैं इसे टेबल से निकालें?


24
यूटीसी में टाइमस्टैम्प को स्टोर करना सबसे अच्छा अभ्यास माना जाता है। उन्हें पेश करते समय स्थानीय समय में परिवर्तित करें।
सीएसएल

2
POSIX UTC के रूप में टाइमस्टैम्प को परिभाषित करता है: stackoverflow.com/a/34107910/895245
Ciro Santilli Sant tim tim tim '

1
सुनिश्चित नहीं हैं कि इस तरह की परेशानी अन्य प्रकार के डेटाबेस का सामना करती है। आप कल्पना करेंगे कि यदि आप जापान में डेटाबेस बनाते हैं, तो आप यूके में डेटा का उपयोग कर सकते हैं!
NoChance

जवाबों:


145

मैंने इस पाठ पर sqlite प्रलेखन ( https://www.sqlite.org/lang_datefunc.html ) पाया :

एक यूनिक्स टाइमस्टैम्प 1092941466 दी गई तारीख और समय की गणना करें, और अपने स्थानीय समयक्षेत्र के लिए क्षतिपूर्ति करें।

SELECT datetime(1092941466, 'unixepoch', 'localtime');

ऐसा नहीं लग रहा था कि यह मेरी आवश्यकताओं के अनुरूप है, इसलिए मैंने "डेटाइम" फ़ंक्शन को थोड़ा बदलने की कोशिश की, और इसके साथ घाव किया:

select datetime(timestamp, 'localtime')

यह काम करने लगता है - क्या यह आपके टाइमज़ोन में बदलने का सही तरीका है, या ऐसा करने का एक बेहतर तरीका है?


64

बस स्थानीय समय को डिफ़ॉल्ट के रूप में उपयोग करें:

CREATE TABLE whatever(
     ....
     timestamp DATE DEFAULT (datetime('now','localtime')),
     ...
);

5
हालांकि, टाइमज़ोन के पार हस्तांतरणीय नहीं होने की समस्या है, नहीं?
वादिम पेरिटोकिन

हाँ, यह मेरे लिए या तो काम नहीं कर रहा है, मैं ZF2 में रोलाइट का उपयोग कर रहा हूँ
रोहुतच

@ आइनोकॉस्टल यह खतरनाक नहीं होना चाहिए जहां अगर आप इसके बारे में जानते हैं और यदि यह आपके कार्यान्वयन को आसान बनाता है, तो क्या इसे करना चाहिए? अगर यह वही है जो मुझे केवल डेटाबेस में स्थानीय समय क्षेत्र को संग्रहीत करने की आवश्यकता है और मुझे पता है कि मेरे आवेदन को कभी अन्य तरीके की आवश्यकता नहीं होगी तो मैं करूंगा।
अहद

1
@xFighter मुझे पता है कि मेरे आवेदन को कभी भी अन्य तरीके की आवश्यकता नहीं है ... जब तक आप उस बारे में नहीं भूल जाते हैं या कोई अन्य इसका उपयोग कर रहा है।
एमकेस्पर

16

आपको एक नियम के रूप में, GMT में डेटाबेस में टाइमस्टैम्प छोड़ना चाहिए, और उन्हें इनपुट / आउटपुट पर स्थानीय समय से / जब आप उन्हें उपयोगकर्ता (सर्वर के नहीं) स्थानीय टाइमस्टैम्प में परिवर्तित कर सकते हैं।

यह अच्छा होगा यदि आप निम्नलिखित कार्य कर सकते हैं:

SELECT DATETIME(col, 'PDT')

... पैसिफिक डेलाइट टाइम पर उपयोगकर्ता के लिए टाइमस्टैम्प का उत्पादन करने के लिए। दुर्भाग्य से, यह काम नहीं करता है। इस SQLite ट्यूटोरियल के अनुसार , हालांकि ("अन्य दिनांक और समय कमांड" पर स्क्रॉल करें), आप समय के लिए पूछ सकते हैं, और फिर उसी समय एक ऑफसेट (घंटों में) लागू कर सकते हैं। इसलिए, यदि आप उपयोगकर्ता के टाइमज़ोन ऑफसेट को जानते हैं, तो आप अच्छे हैं।

हालांकि दिन के उजाले की बचत के नियमों से निपटना नहीं है ...


15

(एक दुर्लभ दुर्लभ) मामले में, जो कि एक स्थानीय डेटाटाइम चाहता है (मैं, उदाहरण के लिए, मेरे डेटाबेस में से किसी एक में स्थानीय समय को संग्रहीत करता हूं क्योंकि मुझे परवाह है कि दिन में क्या समय है और मैं इस बात पर नज़र नहीं रखता कि मैं कहाँ था समय क्षेत्र की अवधि में ...), आप कॉलम को इस प्रकार परिभाषित कर सकते हैं

"timestamp" TEXT DEFAULT (strftime('%Y-%m-%dT%H:%M','now', 'localtime'))

% Y-% m-% dT% H:% M हिस्सा निश्चित रूप से वैकल्पिक है; यह सिर्फ इतना है कि मुझे अपना समय कैसे संग्रहीत करना पसंद है। [इसके अलावा, अगर मेरी धारणा सही है, तो कोई "DATETIME" डेटाटाइप नहीं है, इसलिए यह वास्तव में कोई फर्क नहीं पड़ता कि स्तंभ या DATETIME का उपयोग स्तंभ घोषणा में डेटा प्रकार के रूप में किया जाता है।]


समय पर टिकटें और अनुप्रयोगों में साइक्लाइट स्थानीय समय कम महत्वपूर्ण हो सकता है, जहां अंतिम उपयोगकर्ता किसी बीआई उपकरण के माध्यम से सीधे डेटा का उपयोग नहीं करता है। हालांकि, स्थानीय समय वह है जो आपको सभी एप्लिकेशन विशिष्ट तिथियों जैसे जन्मतिथि को संग्रहीत करने के लिए उपयोग करने की आवश्यकता है।
NoChance

9

जब एक कॉलम परिभाषित किया NOT NULL DEFAULT CURRENT_TIMESTAMPजाता है, " ," सम्मिलित रिकॉर्ड हमेशा UTC / GMT समय के साथ सेट हो जाएगा।

अपने INSERT / UPDATE कथनों में समय को शामिल करने से बचने के लिए मैंने यहां क्या किया है:

--Create a table having a CURRENT_TIMESTAMP:
CREATE TABLE FOOBAR (
    RECORD_NO INTEGER NOT NULL,
    TO_STORE INTEGER,
    UPC CHAR(30),
    QTY DECIMAL(15,4),
    EID CHAR(16),
    RECORD_TIME NOT NULL DEFAULT CURRENT_TIMESTAMP)

--Create before update and after insert triggers:
CREATE TRIGGER UPDATE_FOOBAR BEFORE UPDATE ON FOOBAR
    BEGIN
       UPDATE FOOBAR SET record_time = datetime('now', 'localtime')
       WHERE rowid = new.rowid;
    END

CREATE TRIGGER INSERT_FOOBAR AFTER INSERT ON FOOBAR
    BEGIN
       UPDATE FOOBAR SET record_time = datetime('now', 'localtime')
       WHERE rowid = new.rowid;
    END

यह देखने के लिए परीक्षण करें कि क्या यह काम करता है ...

--INSERT a couple records into the table:
INSERT INTO foobar (RECORD_NO, TO_STORE, UPC, PRICE, EID)
    VALUES (0, 1, 'xyz1', 31, '777')

INSERT INTO foobar (RECORD_NO, TO_STORE, UPC, PRICE, EID)
    VALUES (1, 1, 'xyz2', 32, '777')

--UPDATE one of the records:
UPDATE foobar SET price = 29 WHERE upc = 'xyz2'

--Check the results:
SELECT * FROM foobar

उम्मीद है की वो मदद करदे।


1
क्या यह उपयोगकर्ता के द्वारा दिए गए उत्तर से भिन्न है, जो कुछ भी सृजन करते हैं (.... टाइमस्टैम्प दिनांक DEFAULT (डेटाटाइम) (अब ',' स्थानीय समय '));););
NoChance



4

आप केवल स्टैम्पटाइम () का उपयोग करके टाइम कॉलम को टाइमस्टैम्प में बदल सकते हैं:

SELECT strftime('%s', timestamp) as timestamp FROM ... ;

आपको देता है:

1454521888

'टाइमस्टैम्प' टेबल कॉलम current_timestampDEFAULT के रूप में भी एक पाठ क्षेत्र हो सकता है ।

बिना किसी शर्त के:

SELECT timestamp FROM ... ;

आपको देता है:

2016-02-03 17:51:28


3

मुझे लगता है कि इससे मदद मिल सकती है।

SELECT datetime(strftime('%s','now'), 'unixepoch', 'localtime');

बेपरवाही के लिए; चयन स्ट्रैपटाइम ('% s', 'अब', 'स्थानीय समय');
PodTech.io


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