当前位置:  开发笔记 > 前端 > 正文

Sqlite:CURRENT_TIMESTAMP是GMT,而不是机器的时区

如何解决《Sqlite:CURRENT_TIMESTAMP是GMT,而不是机器的时区》经验,为你挑选了7个好方法。

我有一个带有此列定义的sqlite(v3)表:

"timestamp" DATETIME DEFAULT CURRENT_TIMESTAMP

此数据库所在的服务器位于CST时区.当我在不包含timestamp列的情况下插入到我的表中时,sqlite会自动使用GMT中的当前时间戳填充该字段,而不是CST.

有没有办法修改我的insert语句以强制存储的时间戳在CST中?另一方面,最好将它存储在GMT中(例如,如果数据库被移动到不同的时区),那么我是否可以修改我的选择SQL以将存储的时间戳转换为CST从表中提取它?



1> BrianH..:

我SQLite的文档(上找到https://www.sqlite.org/lang_datefunc.html)这样的文字:

在给定unix时间戳1092941466的情况下计算日期和时间,并补偿您当地的时区.

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

这并不像它适合我的需要,所以我试图改变周围位"日期时间"功能,伤口与此:

select datetime(timestamp, 'localtime')

这似乎工作 - 是正确的方法来为你的时区转换,或是否有更好的方式来做到这一点?


这是在SQLite中将时间戳转换为本地时间的正确方法.
SELECT datetime(CURRENT_TIMESTAMP,'localtime')将是一个非常需要的问题
这是日期时间函数的一些强大功能.+1帮助我.我注意到它真的很强大,你可以把它扔到它:datetime(date_field,time_field)ex:2012-10-13 | 04:15它会吐出这个:2012-10-13 04:15:00.非常强大.

2> hoju..:

只需使用本地时间作为默认值:

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


这确实存在不能跨时区转移的问题,不是吗?

3> Roger Lipsco..:

作为一项规则,您应该在GMT中将时间戳保留在数据库中,并且只能在输入/输出上将它们转换为本地时间/从本地时间转换它们,此时您可以将它们转换为用户(而不是服务器)的本地时间戳.

如果你能做到以下几点会很好:

SELECT DATETIME(col, 'PDT')

...在Pacific Daylight Time输出用户的时间戳.不幸的是,这不起作用.但是,根据这个SQLite教程(向下滚动到"其他日期和时间命令"),您可以询问时间,然后同时应用偏移量(以小时为单位).所以,如果您确实知道用户的时区偏移,那么您就是好的.

不涉及夏令时规则,但......



4> polyglot..:

在(很少见的)需要本地数据时间的情况下(例如,我将当地时间存储在我的一个数据库中,因为我关心的是当天的时间,我不记得我在哪里在时区方面......),您可以将列定义为

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

%Y-%m-%dT%H:%M部分当然是可选的; 这就是我喜欢存储时间的方式.[另外,如果我的印象是正确的,sqlite中没有"DATETIME"数据类型,因此TEXT或DATETIME是否用作列声明中的数据类型并不重要.]



5> 小智..:

当列有" 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

希望有所帮助.



6> liquide..:
SELECT datetime('now', 'localtime');



7> Jens A. Koch..:

SELECT datetime(CURRENT_TIMESTAMP, 'localtime')

推荐阅读
放ch养奶牛
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有