سكليتي قيمة الوقت الافتراضي قاعدة البيانات 'الآن'

StackOverflow https://stackoverflow.com/questions/200309

  •  03-07-2019
  •  | 
  •  

سؤال

هل من الممكن في قاعدة بيانات SQLite لcraete جدول يحتوي على عمود الطابع الزمني الذي الافتراضي إلى DATETIME('now')؟

ومثل هذا:

CREATE TABLE test (
    id INTEGER PRIMARY KEY AUTOINCREMENT, 
    t TIMESTAMP DEFAULT DATETIME('now')
);

وهذا يعطي خطأ ... كيفية حل؟

هل كانت مفيدة؟

المحلول

وأعتقد يمكنك استخدام

CREATE TABLE test (
  id INTEGER PRIMARY KEY AUTOINCREMENT,
  t TIMESTAMP
  DEFAULT CURRENT_TIMESTAMP
);

وكما في الإصدار 3.1 ( مصدر )

نصائح أخرى

ووفقا لما ذكره الدكتور هيب في آخر القائمة الأخيرة:

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

وانها مجرد خطأ في بناء الجملة، تحتاج قوسين: (DATETIME('now'))

إذا نظرتم الى ، فسوف نلاحظ أن الأقواس وأضاف حول خيار "EXPR" في بناء الجملة.

وهذا هو مثال كامل على أساس إجابات وتعليقات أخرى على السؤال. في المثال الطابع الزمني (created_at العمود) وحفظها في يونكس عصر التوقيت UTC وتحويلها إلى المحلية التوقيت عند الضرورة فقط.

وعن طريق يونكس عصر يوفر مساحة تخزين - 4 بايت عدد صحيح مقابل سلسلة 24 بايت عند تخزينها على النحو ISO8601 سلسلة، انظر أنواع البيانات . إذا 4 بايت ليست كافية التي يمكن زيادتها إلى 6 أو 8 بايت.

وتوفير الطابع الزمني على المنطقة الزمنية UTC يجعلها ملائمة لإظهار قيمة معقولة في المناطق الزمنية متعددة.

ونسخة سكليتي هو 3.8.6 الذي يأتي مع أوبونتو LTS 14.04.

$ sqlite3 so.db
SQLite version 3.8.6 2014-08-15 11:46:33
Enter ".help" for usage hints.
sqlite> .headers on

create table if not exists example (
   id integer primary key autoincrement
  ,data text not null unique
  ,created_at integer(4) not null default (strftime('%s','now'))
);

insert into example(data) values
 ('foo')
,('bar')
;

select
 id
,data
,created_at as epoch
,datetime(created_at, 'unixepoch') as utc
,datetime(created_at, 'unixepoch', 'localtime') as localtime
from example
order by id
;

id|data|epoch     |utc                |localtime
1 |foo |1412097842|2014-09-30 17:24:02|2014-09-30 20:24:02
2 |bar |1412097842|2014-09-30 17:24:02|2014-09-30 20:24:02

وLOCALTIME هو الصحيح كما أنا تقع في UTC + 2 DST في لحظة الاستعلام.

وربما يكون من الأفضل استخدام نوع الحقيقي، لتوفير مساحة التخزين.

واقتبس من 1.2 قسم من أنواع البيانات في سكليتي الإصدار 3

<اقتباس فقرة>   

وليس لديها سكليتي فئة التخزين المخصصة لتخزين التمور   و / أو مرات. بدلا من ذلك، المدمج في التاريخ والوقت وظائف سكليتي   هي قادرة على تخزين التواريخ والأوقات كما TEXT، ريال، أو INTEGER   القيم

CREATE TABLE test (
    id INTEGER PRIMARY KEY AUTOINCREMENT, 
    t REAL DEFAULT (datetime('now', 'localtime'))
);

عمود القيد .

و إدراج على التوالي دون تقديم أي قيمة.

INSERT INTO "test" DEFAULT VALUES;

ومن خطأ لغوي لأنك لم يكتب بين قوسين

وإذا كنت أكتب

<اقتباس فقرة>   

وتحديد التاريخ والوقت ( 'الآن')   بعد ذلك سوف تعطيك وقت UTC ولكن إذا كنت هذه الكتابة عنها الاستعلام ثم يجب إضافة أقواس قبل هذا   حتى (التاريخ والوقت ( 'الآن')) عن التوقيت العالمي.   لبالتوقيت المحلي نفسه   حدد التاريخ والوقت ( 'الآن'، 'LOCALTIME')   للاستعلام

و(التاريخ والوقت ( 'الآن'، 'LOCALTIME'))

وهذا المثال بديل يخزن بالتوقيت المحلى حيث عدد صحيح لإنقاذ بايت 20. ويتم العمل في الحقل الافتراضي، تحديث الزناد، وعرض. STRFTIME يجب استخدام '٪ ق' (علامات الاقتباس المفردة) لأن "٪ ق" (التنصيص) ألقى خطأ "غير ثابت" على لي.

Create Table Demo (
   idDemo    Integer    Not Null Primary Key AutoIncrement
  ,DemoValue Text       Not Null Unique
  ,DatTimIns Integer(4) Not Null Default (strftime('%s', DateTime('Now', 'localtime'))) -- get Now/UTC, convert to local, convert to string/Unix Time, store as Integer(4)
  ,DatTimUpd Integer(4)     Null
);

Create Trigger trgDemoUpd After Update On Demo Begin
  Update Demo Set
    DatTimUpd  =                          strftime('%s', DateTime('Now', 'localtime'))  -- same as DatTimIns
  Where idDemo = new.idDemo;
End;

Create View If Not Exists vewDemo As Select -- convert Unix-Times to DateTimes so not every single query needs to do so
   idDemo
  ,DemoValue
  ,DateTime(DatTimIns, 'unixepoch') As DatTimIns -- convert Integer(4) (treating it as Unix-Time)
  ,DateTime(DatTimUpd, 'unixepoch') As DatTimUpd --   to YYYY-MM-DD HH:MM:SS
From Demo;

Insert Into Demo (DemoValue) Values ('One');                      -- activate the field Default
-- WAIT a few seconds --    
Insert Into Demo (DemoValue) Values ('Two');                      -- same thing but with
Insert Into Demo (DemoValue) Values ('Thr');                      --   later time values

Update Demo Set DemoValue = DemoValue || ' Upd' Where idDemo = 1; -- activate the Update-trigger

Select * From    Demo;                                            -- display raw audit values
idDemo  DemoValue  DatTimIns   DatTimUpd
------  ---------  ----------  ----------
1       One Upd    1560024902  1560024944
2       Two        1560024944
3       Thr        1560024944

Select * From vewDemo;                                            -- display automatic audit values
idDemo  DemoValue  DatTimIns            DatTimUpd
------  ---------  -------------------  -------------------
1       One Upd    2019-06-08 20:15:02  2019-06-08 20:15:44
2       Two        2019-06-08 20:15:44
3       Thr        2019-06-08 20:15:44
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top