0

在我的 sqlite 表中,我以这种方式在 GMT 时区的时间戳中存储了一个日期:

CREATE TABLE task (
id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
date INTEGER,
    name TEXT
);

当我查询数据库时,我想用本地时间检索日期,所以:

NSTimeInterval now = [[NSDate date] timeIntervalSince1970];

现在的时间戳是我当地的时区,所以例如,如果有可能我想这样做:

SELECT id,date,name FROM task WHERE converttolocal(date) = now;

我想知道sqlite中是否存在一个函数,例如converttolocal自动转换时间戳......

编辑

我找到了这个:

strftime('%s',date, 'unixepoch', 'localtime')

但是,例如,如果数据库中的日期 gmt 是:1375660800那就是:

 GMT: Mon, 05 Aug 2013 00:00:00 GMT

在函数 strftime 之后,结果是:1375668000对应于我的当地时间:

 (CEST) Mine time zone: 05 agosto 2013 04:00:00

但我希望 strftime 函数的结果给我这个:1375653600那就是:

Mine time zone: 05 agosto 2013 00:00:00 CEST

为什么不给我这个结果?

4

2 回答 2

1
SELECT id,date,name FROM task WHERE datetime('date', 'unixepoch', 'localtime') = datetime('now','unixepoch');

这将起作用。但是左侧的值永远不会与右侧的值匹配,并且您将永远不会检索到值,因为您正在捕获时间戳,当您进行比较时,时间戳值会发生变化。

所以,SELECT id,date,name FROM task WHERE converttolocal(date) = now;永远不会是真的。

于 2013-08-05T10:34:34.643 回答
1

要将 Unix 时间戳转换为 SQLite 的默认日期格式,请使用unixepoch修饰符。要将时间从 UTC 转换为本地时间,请使用localtime修饰符。要将 SQLite 的默认日期格式转换为 Unix 时间戳,请使用strftime格式%s

SELECT id,date,name FROM task WHERE strftime('%s', date, 'unixepoch', 'localtime') = ?

使用 SQLite 的内置方法可能更容易获取当前时间,该时间已经是 UTC:

SELECT id,date,name FROM task WHERE datetime('%s', date, 'unixepoch') = datetime('now')

但是,如果您只有dates,您想忽略时间部分。在这种情况下,使用date代替datetime

SELECT id,date,name FROM task WHERE date('%s', date, 'unixepoch') = date('now')
于 2013-08-05T11:44:33.763 回答