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




sqlite timezone (8)

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

मेरे 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

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

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

"timestamp" DATETIME DEFAULT CURRENT_TIMESTAMP

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

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


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

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

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


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

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

SELECT DATETIME(col, 'PDT')

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

डेलाइट सेविंग नियमों के साथ सौदा नहीं करता है, यद्यपि ...


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

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

मुझे स्क्लाइट प्रलेखन ( https://www.sqlite.org/lang_datefunc.html ) पर मिला यह पाठ:

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

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

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

select datetime(timestamp, 'localtime')

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



Time ( 'now', 'localtime' ) और तिथि ( 'now', 'localtime' ) काम करता है।


SELECT datetime('now', 'localtime');




timestamp