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

我有一个 sqlite (v3)表,其列定义如下:

"timestamp" DATETIME DEFAULT CURRENT_TIMESTAMP

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

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

224284 次浏览

我在 sqlite 文档(https://www.sqlite.org/lang_datefunc.html)上找到了这段文字:

计算给定 Unix 的日期和时间 时间戳1092941466 你们当地的时区。

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

这看起来并不符合我的需要,所以我试着改变了一下“ datetime”函数,最后得到了这样的结果:

select datetime(timestamp, 'localtime')

这似乎有效-这是正确的方式转换为您的时区,或者有一个更好的方法来做到这一点?

通常,应该在数据库中保留 GMT 格式的时间戳,只有在可以将它们转换为用户(而非服务器)的本地时间戳时,才能在输入/输出时将它们转换为/从本地时间转换为/。

如果你能做到以下几点就好了:

SELECT DATETIME(col, 'PDT')

... 输出 UTC-7上用户的时间戳。不幸的是,这招不管用。然而,根据 本 SQLite 教程(向下滚动到“其他日期和时间命令”) ,您可以询问时间,然后同时应用偏移量(以小时为单位)。所以,如果您确实知道用户的时区偏移量,就可以了。

虽然没有遵守夏令时的规定。

我觉得这个可能会有帮助。

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

在需要一个本地数据时间的情况下(例如,我将本地时间存储在我的数据库中,因为我关心的只是一天中的时间是什么,而不是根据时区跟踪我在哪里... ...) ,可以将该列定义为

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

% Y -% m -% dT% H:% M 部分当然是可选的; 这正是我希望存储时间的方式。[另外,如果我的印象是正确的,sqlite 中没有“ DATETIME”数据类型,所以在列声明中是否使用 TEXT 或 DATETIME 作为数据类型并不重要。]

当使用“ 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

希望能帮上忙。

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

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

当前时间,在您的机器的时区:

select time(time(), 'localtime');

根据 http://www.sqlite.org/lang_datefunc.html

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

Time ( 'now', 'localtime' )和日期 ( 'now', 'localtime' )工程。

SELECT datetime(CURRENT_TIMESTAMP, 'localtime')

还可以使用 strftime ()将时间列转换为时间戳:

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

给你:

1454521888

使用 current_timestamp作为 DEFAULT,‘ time戳’表列甚至可以是一个文本字段。

没有时间限制:

SELECT timestamp FROM ... ;

给你:

2016-02-0317:51:28