কীভাবে এসকিউএলটিতে একটি স্বয়ংক্রিয় টাইমস্ট্যাম্প থাকবে?


132

আমার কাছে একটি এসকিউএল ডাটাবেস, সংস্করণ 3 রয়েছে এবং আমি এই ডাটাবেসটি ব্যবহার করে এমন অ্যাপ্লিকেশন তৈরি করতে সি # ব্যবহার করছি।

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

উদাহরণস্বরূপ, এমএস এসকিউএল সার্ভারে যদি আমি একটি টাইমস্ট্যাম্প ক্ষেত্র ব্যবহার করি তবে এটি ডেটাবেস দ্বারা আপডেট হয়, আমাকে নিজের দ্বারা সেট করতে হবে না। এসকিউএলাইটে এটি কি সম্ভব?

উত্তর:


212

কেবল একটি ক্ষেত্রের জন্য একটি ডিফল্ট মান ঘোষণা করুন:

CREATE TABLE MyTable(
    ID INTEGER PRIMARY KEY,
    Name TEXT,
    Other STUFF,
    Timestamp DATETIME DEFAULT CURRENT_TIMESTAMP
);

তবে, যদি আপনার INSERTআদেশটি এই ক্ষেত্রকে স্পষ্টভাবে সেট করে NULL, এটিতে সেট করা হবে NULL


5
এটি এসকিউএল সার্ভারের টাইমস্ট্যাম্পের সমতুল্য নয় কারণ এটি সিস্টেম ঘড়ির উপর ভিত্তি করে; আপনি যদি ঘড়িটি পরিবর্তন করেন তবে মানটি পিছনের দিকে যেতে পারে। এসকিউএল সার্ভারে টাইমস্ট্যাম্প মানগুলি সর্বদা বৃদ্ধি করে।
ররি ম্যাকলিউড

26
@ ম্যাথিউউ কোনও DATETIME ডেটা টাইপ নেই, তবে এসকিউএলাইট যেকোন কিছুই ফিল্ডের ধরণ হিসাবে গ্রহণ করে ।
সিএল

4
@ ম্যাথিউউ আপনি সরবরাহ করেছেন সেই লিঙ্কটিতে এসকিউএলাইটে উল্লেখ করা ডেটাটাইম ডেটাটাইপ রয়েছে। 2.2 সম্পর্কের নাম উদাহরণ পড়ুন
রফিক মোহাম্মদ

6
এটি আপডেটের বিবৃতিগুলি কভার করে বলে মনে হচ্ছে না। দেখে মনে হচ্ছে ট্রিগার হ'ল এটি করার একমাত্র উপায়।
ডেল অ্যান্ডারসন

2
@ সিএল দুঃখিত, আপনি ঠিক বলেছেন। আমি আপনার উত্তর এবং জাভেদের ভুলভাবে মার্জ করেছি। এর সাথে DEFAULT (STRFTIME('%Y-%m-%d %H:%M:%f', 'NOW', 'localtime'))আসলে অর্থবহ মাইক্রোসেকেন্ডের মান পাওয়া যায়।
ডায়েটমার

71

আপনি এসকিউএলাইটে টেবিলটিতে টাইমস্ট্যাম্প ক্ষেত্র তৈরি করতে পারেন, এটি দেখুন:

CREATE TABLE my_table (
    id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
    name VARCHAR(64),
    sqltime TIMESTAMP DEFAULT CURRENT_TIMESTAMP NOT NULL
);

INSERT INTO my_table(name, sqltime) VALUES('test1', '2010-05-28T15:36:56.200');
INSERT INTO my_table(name, sqltime) VALUES('test2', '2010-08-28T13:40:02.200');
INSERT INTO my_table(name) VALUES('test3');

এটি ফলাফল:

SELECT * FROM my_table;

এখানে চিত্র বর্ণনা লিখুন


অ-ধ্রুবক ডিফল্ট (ALTER TABLE "main"। "Xxx_data" ADOL COLUMN "তৈরি_date" TIMESTAMP NURL DEFULT CURRENT_TIMESTAMP) সহ একটি কলাম যুক্ত করতে পারছে না
টয়িং_টোয়িং

14

ডেটফ্যাঙ্ক পড়া স্বয়ংক্রিয় ডেটটাইম সমাপ্তির একটি কার্যকারী উদাহরণ হ'ল :

sqlite> CREATE TABLE 'test' ( 
   ...>    'id' INTEGER PRIMARY KEY,
   ...>    'dt1' DATETIME NOT NULL DEFAULT (datetime(CURRENT_TIMESTAMP, 'localtime')), 
   ...>    'dt2' DATETIME NOT NULL DEFAULT (strftime('%Y-%m-%d %H:%M:%S', 'now', 'localtime')), 
   ...>    'dt3' DATETIME NOT NULL DEFAULT (strftime('%Y-%m-%d %H:%M:%f', 'now', 'localtime'))
   ...> );

আসুন এমন কিছু সারি সন্নিবেশ করান যা স্বয়ংক্রিয়ভাবে ডেটটাইম সমাপ্তির সূচনা করে:

sqlite> INSERT INTO 'test' ('id') VALUES (null);
sqlite> INSERT INTO 'test' ('id') VALUES (null);

সঞ্চিত ডেটা পরিষ্কারভাবে দেখায় যে প্রথম দুটি একই তবে তৃতীয় ফাংশন নয়:

sqlite> SELECT * FROM 'test';
1|2017-09-26 09:10:08|2017-09-26 09:10:08|2017-09-26 09:10:08.053
2|2017-09-26 09:10:56|2017-09-26 09:10:56|2017-09-26 09:10:56.894

মনোযোগ দিন যে এসকিউএল ফাংশনগুলি প্রথম বন্ধনে আবদ্ধ! এটি একটি উদাহরণে এটি দেখানো কতটা কঠিন ছিল?

আনন্দ কর!


7

আপনি ট্রিগার ব্যবহার করতে পারেন। খুব ভাল কাজ করে

CREATE TABLE MyTable(
ID INTEGER PRIMARY KEY,
Name TEXT,
Other STUFF,
Timestamp DATETIME);


CREATE TRIGGER insert_Timestamp_Trigger
AFTER INSERT ON MyTable
BEGIN
   UPDATE MyTable SET Timestamp =STRFTIME('%Y-%m-%d %H:%M:%f', 'NOW') WHERE id = NEW.id;
END;

CREATE TRIGGER update_Timestamp_Trigger
AFTER UPDATE On MyTable
BEGIN
   UPDATE MyTable SET Timestamp = STRFTIME('%Y-%m-%d %H:%M:%f', 'NOW') WHERE id = NEW.id;
END;

6

উপরের উত্তর পরিপূরক ...

আপনি যদি EF ব্যবহার করে থাকেন তবে সম্পত্তিটিকে ডেটা টীকাগুলি [টাইমস্ট্যাম্প] দিয়ে সজ্জিত করুন, তারপরে আপনার প্রসঙ্গ শ্রেণীর অভ্যন্তরে ওভাররাইড অনমোডেলক্রিয়াটিং এ যান এবং এই ফ্লুয়েট এপিআই কোড যুক্ত করুন:

modelBuilder.Entity<YourEntity>()
                .Property(b => b.Timestamp)
                .ValueGeneratedOnAddOrUpdate()
                .IsConcurrencyToken()
                .ForSqliteHasDefaultValueSql("CURRENT_TIMESTAMP");

এটি এই টেবিলের মধ্যে প্রবেশ করা হবে এমন প্রতিটি ডেটাতে একটি ডিফল্ট মান তৈরি করবে।


জ্যামারিন অ্যাপে অ্যান্টিটি অ্যান্ড্রয়েডে কীভাবে সম্পাদন করে তা জানুন? পরীক্ষার কাছাকাছি যেতে পারেনি, যদিও ডএএল এর সাথে প্রতিস্থাপন করা ভাল হবে।
সমিস

স্ক্লাইটহ্যাসডিফল্টের জন্য প্রয়োজনীয় প্যাকেজটি আমি খুঁজে পাই না। আপনি জানেন যে নুগেট থেকে আমার কোন প্যাকেজটি পেতে হবে?
সাইমনস 02

@ সিমোনসন, এই মাইক্রোসফ্টটি ব্যবহার করার চেষ্টা করুন।
রাফায়েল

2

আপনি ব্যবহার করে কাস্টম ডেটটাইম ব্যবহার করতে পারেন ...

 create table noteTable3 
 (created_at DATETIME DEFAULT (STRFTIME('%d-%m-%Y   %H:%M', 'NOW','localtime')),
 title text not null, myNotes text not null);

বর্তমান সিস্টেমের তারিখ পেতে 'এখন', 'লোকালটাইম' ব্যবহার করুন অন্যথায় এটি আপনার ডিবিতে সন্নিবেশের সময়টি আপনার ডাটাবেজে কিছু অতীত বা অন্য সময় প্রদর্শিত হবে।

তোমাকে ধন্যবাদ...


1
আপনার যদি মাইক্রোসেকেন্ডের প্রয়োজন হয় তবে দরকারী; আপনি ডিফল্ট (স্ট্রফটাইম টাইম ('% Y-% m-% d% H:% M:% f', 'এখন', 'স্থানীয় সময়')) ব্যবহার করতে পারেন `` কেবলমাত্র ডিফল্ট CURRENT_TIMESTAMP বললে আপনাকে কেবল এক সেকেন্ডের গ্রানুলারিটি দেবে।
ডায়েটমার

এটি অবশ্যই কাজ করে! বন্ধনী দিয়ে ঘেরা যেমন স্ট্রফটাইম () তে মনোযোগ দিন!
সেন্টুরিয়ান

0

আপনি যদি এসকিউএলডিটি ডিবি-ব্রাউজার ব্যবহার করেন তবে আপনি এইভাবে ডিফল্ট মানটি পরিবর্তন করতে পারেন:

  1. ডাটাবেস কাঠামো চয়ন করুন
  2. টেবিল নির্বাচন করুন
  3. সারণী পরিবর্তন করুন
  4. আপনার কলামে 'ডিফল্ট মান' মানটির নীচে রাখা হয়েছে: = (তারিখের সময় ('এখন', 'স্থানীয় সময়'))

আমি আগে আপনার ডাটাবেস আপডেট করার পরামর্শ দিচ্ছি, কারণ মানটির একটি ভুল ফর্ম্যাট এসকিউএলাইট ব্রাউজারে সমস্যা দেখা দিতে পারে।

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