স্ক্লাইট: CURRENT_TIMESTAMP GMT- এ রয়েছে, মেশিনের টাইমজোন নয়


118

আমার এই কলাম সংজ্ঞা সহ একটি স্ক্লাইট (v3) টেবিল রয়েছে:

"timestamp" DATETIME DEFAULT CURRENT_TIMESTAMP

এই ডাটাবেসটিতে থাকা সার্ভারটি সিএসটি সময় অঞ্চলে is আমি যখন টাইমস্ট্যাম্প কলামটি অন্তর্ভুক্ত না করে আমার টেবিলটিতে প্রবেশ করি, তখন স্ক্লাইটটি স্বয়ংক্রিয়ভাবে সেই ক্ষেত্রটি সিসিটি নয়, GMT- তে বর্তমান টাইমস্ট্যাম্পের সাহায্যে পপুলেটে।

সঞ্চিত টাইমস্ট্যাম্পটি সিএসটিতে রাখতে বাধ্য করার জন্য আমার সন্নিবেশ বিবৃতিটি সংশোধন করার কোনও উপায় আছে? অন্যদিকে, এটি GMT- এ সংরক্ষণ করা ভাল (উদাহরণস্বরূপ, ডাটাবেসটি অন্য একটি টাইমজোনে স্থানান্তরিত হয়ে যায়, উদাহরণস্বরূপ), সুতরাং আমি যখন আমার নির্বাচিত এসকিউএলকে সঞ্চিত টাইমস্ট্যাম্পটিকে সিএসটিতে রূপান্তর করতে পারি তখন কোনও উপায় আছে যখন আমি টেবিল থেকে এটি নিষ্কাশন?


24
ইউটিসিতে টাইমস্ট্যাম্পগুলি সংরক্ষণ করা সর্বোত্তম অনুশীলন হিসাবে বিবেচিত হয়। স্থানীয় সময় তাদের উপস্থাপনের সময় রূপান্তর করুন।
সিএসএল

2
: POSIX ইউটিসি যেমন টাইমস্ট্যাম্প সংজ্ঞায়িত stackoverflow.com/a/34107910/895245
সিরো Santilli郝海东冠状病六四事件法轮功

1
নিশ্চিত না যে এই ধরণের সমস্যা অন্যান্য ধরণের ডাটাবেসের মুখোমুখি হয়। আপনি কল্পনা করতে পারেন যে আপনি যদি জাপানে একটি ডাটাবেস তৈরি করেন তবে আপনি ইউকেতে ডেটা ব্যবহার করতে পারবেন!
NoChance

উত্তর:


145

আমি স্ক্লাইট ডকুমেন্টেশনে ( 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
এর ফলে টাইমজোনগুলিতে স্থানান্তরযোগ্য না হওয়ার সমস্যা আছে, না?
ভাদিম পেরেটোকিন

হ্যাঁ এটি আমার পক্ষে কাজ করছে না, আমি জেডএফ 2-তে স্ক্লাইট ব্যবহার করছি
রোহতেচ

@ আইকোনোক্লাস্ট এটি বিপজ্জনক হওয়া উচিত নয় যেখানে আপনি যদি এই বিষয়ে সচেতন হন এবং এটি যদি আপনার বাস্তবায়ন আরও সহজ করে তোলে তবে তা করা উচিত? যদি এটি কেবলমাত্র স্থানীয় সময় অঞ্চলটি ডাটাবেসে সংরক্ষণ করতে হয় এবং আমি জানি যে আমার অ্যাপ্লিকেশনটি অন্যভাবে অন্যভাবে প্রয়োজন হয় না তবে আমি করব।
আহাদ

1
@ এক্সফাইটার আমি জানি আমার অ্যাপ্লিকেশনটির আর কখনও প্রয়োজন হয় না ... যতক্ষণ না আপনি এটির কথা ভুলে যান বা অন্য কেউ এটি ব্যবহার করছেন না।
এমকেস্পার

16

আপনার, একটি নিয়ম হিসাবে, GMT- তে ডাটাবেসে টাইমস্ট্যাম্পগুলি ছেড়ে দেওয়া উচিত এবং কেবলমাত্র স্থানীয় সময় / ইনপুট / আউটপুটগুলিতে রূপান্তর করতে হবে, যখন আপনি তাদের ব্যবহারকারীর (সার্ভারের নয়) স্থানীয় টাইমস্ট্যাম্পে রূপান্তর করতে পারেন।

আপনি নিম্নলিখিতটি করতে পারলে ভাল লাগবে:

SELECT DATETIME(col, 'PDT')

... প্রশান্ত মহাসাগরীয় দিবালোক সময় ব্যবহারকারীর জন্য টাইমস্ট্যাম্প আউটপুট। দুর্ভাগ্যক্রমে, এটি কাজ করে না। এই এসকিউএল টিউটোরিয়াল অনুসারে , তবে ("অন্যান্য তারিখ এবং সময় কমান্ডগুলি" এ স্ক্রোল করুন), আপনি সময় চাইতে পারেন এবং তারপরে একই সময়ে একটি অফসেট (কয়েক ঘন্টার মধ্যে) প্রয়োগ করতে পারেন। সুতরাং, যদি আপনি ব্যবহারকারীর টাইমজোন অফসেটটি জানেন তবে আপনি ভাল।

দিবালোক সংরক্ষণের নিয়মগুলি ব্যবহার করে না, যদিও ...


15

একটি স্থানীয় ডেটাটাইম চাওয়া হয়েছে ((বিরল স্বীকার করা হয়েছে) ক্ষেত্রে (উদাহরণস্বরূপ, স্থানীয় সময়কে আমার একটি ডাটাবেসে সংরক্ষণ করুন যেহেতু দিনের যে সময়টি ছিল তা আমার যত্ন ছিল এবং আমি কোথায় ছিল সে সম্পর্কে ট্র্যাক করি না টাইম জোনের মেয়াদে ...), আপনি কলামটি হিসাবে সংজ্ঞায়িত করতে পারেন

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

% Y-% m-% dT% H:% M অংশ অবশ্যই alচ্ছিক; আমার সময়টি কীভাবে সংরক্ষণ করতে হয় তা ঠিক তাই। [এছাড়াও, যদি আমার ছাপটি সঠিক হয়, স্ক্লাইটে কোনও "DATETIME" ডেটাটাইপ নেই, সুতরাং কলাম ঘোষণায় টেক্সট বা DATETIME ডেটা টাইপ হিসাবে ব্যবহৃত হয় তা আসলেই কিছু যায় আসে না]]


টাইম স্ট্যাম্পগুলিতে এবং অ্যাপ্লিকেশনগুলিতে স্কিলাইট স্থানীয় সময় কম গুরুত্বপূর্ণ হতে পারে যেখানে শেষ ব্যবহারকারী সরাসরি বিআই সরঞ্জামের মাধ্যমে ডেটা ব্যবহার করে না। তবে, স্থানীয় সময় যা আপনার প্রয়োজন সমস্ত জন্ম তারিখ যেমন নির্দিষ্ট তারিখ সংরক্ষণ করতে ব্যবহার করা প্রয়োজন।
NoChance

9

" NOT NULL DEFAULT CURRENT_TIMESTAMP," সন্নিবেশিত রেকর্ডগুলি সর্বদা ইউটিসি / জিএমটি সময়ের সাথে সেট হয়ে যাবে defined

আমার INSERT / আপডেটের বিবৃতিতে সময়টি অন্তর্ভুক্ত না করার জন্য আমি কী করেছি তা এখানে:

--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
এটি কি ব্যবহারকারী হুজুর প্রদত্ত উত্তরের চেয়ে আলাদা, টেবিলে যা কিছু তৈরি করুন (.... টাইমস্ট্যাম্প তারিখের ত্রুটি (তারিখের সময় ('এখন', 'স্থানীয় সময়')))।);?)
NoChance



4

আপনি কেবল স্ট্রাইফটাইম () ব্যবহার করে সময় কলামকে টাইমস্ট্যাম্পে রূপান্তর করতে পারেন:

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

আপনি দেয়:

1454521888

'টাইমস্ট্যাম্প' সারণী কলামটি current_timestampডিফল্ট হিসাবে ব্যবহার করে এমনকি পাঠ্য ক্ষেত্র হতে পারে ।

স্ট্রফটাইম ছাড়াই:

SELECT timestamp FROM ... ;

আপনি দেয়:

2016-02-03 17:51:28


3

আমি মনে করি এটি সাহায্য করতে পারে।

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

অসাধারণ জন্য; স্ট্রফটাইম ('% s', 'এখন', 'লোকালটাইম') নির্বাচন করুন;
পডটেক.ইও


আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.