21

sqlite在移动设备和我的数据库中使用本地数据库,我有带有列名的日期字段RN_CREATE_DATE。我的RN_CREATE_DATE列值采用这种格式'dd-mm-yy HH:MM:SS',我想获取给定日期的数据。我尝试使用以下数据库列和值的确切查询是什么

**RN_CREATE_DATE

2012-07-27 11:04:34

2012-05-28 10:04:34
2012-07-22 09:04:34**

SELECT  RN_CREATE_DATE 
FROM DISPOSITION 
WHERE  RN_CREATE_DATE=strftime('%Y', '2012-07-28 12:04:34')

但没有找到结果,请帮我解决这个问题。

4

4 回答 4

37

strftime像这样工作:

sqlite> select strftime('%d-%m-%Y %H:%M:%S', datetime('now'));
2012-09-13 12:42:56

如果要在WHERE子句中使用它,请替换为格式datetime('now')中要匹配的日期时间 。YYYY-mm-dd HH:MM:SS

例子:

SELECT *
  FROM t
 WHERE c = strftime('%d-%m-%Y %H:%M:%S', '2012-09-13 12:44:22');
--                   dd-mm-YYYY HH:MM:SS  YYYY-mm-dd HH:MM:SS
于 2012-09-13T12:45:01.537 回答
3

我想添加一些有关在 UNIX 纪元时间中使用 SQLite 日期和时间的信息:

UNIX 纪元是 1970-01-01 的 00:00:00,即 1970 年 1 月 1 日午夜。UNIX 机器(如运行 Linux 的机器)上的当前时间以从那时起以秒为单位测量。

SQLite 支持这个纪元时间,我发现它在 SQLite 中用作 DateTime 字段的格式非常有用。

具体来说,假设我想要一个 Event 表,用于音乐会等活动。我想要一个 fromDateTime 字段来存储活动开始的时间。我可以通过将 fromDateTime 字段设置为 INTEGER 类型来做到这一点,如下所示:

CREATE TABLE IF NOT EXISTS Event(
    eventID                     INTEGER PRIMARY KEY,
    name                        TEXT,
    ratingOutOf10               REAL,
    numberOfRatings             INTEGER,
    category                    TEXT,   
    venue                       TEXT,
    fromDateTime                INTEGER,
    description                 TEXT,   
    pricesList                  TEXT,   
    termsAndConditions          TEXT                
);

现在,让我们来看看 UNIX 纪元与 SQLite DateTime 字段的用法:

Basic
    select strftime('%s', '2016-01-01 00:10:11');               --returns 1451607012
    select datetime(1451607012, 'unixepoch');                   --returns 2016-01-01 00:10:11
    select datetime(1451607012, 'unixepoch', 'localtime');      --returns 2016-01-01 05:40:11 i.e. local time (in India, this is +5:30).

Only dates and/or times:
    select strftime('%s', '2016-01-01');                        --returns 1451606400
    select strftime('%s', '2016-01-01 16:00');                  --returns 1451664000
    select date(-11168899200, 'unixepoch');                     --returns 1616-01-27        
    select time(-11168899200, 'unixepoch');                     --returns 08:00:00

Other stuff:
    select strftime('%d-%m-%Y %H:%M:%S', '2012-09-13 12:44:22') --returns 13-09-2012 12:44:22

现在,这是我们的事件表的上述示例用法:

EXAMPLE:
    insert into Event 
        (name, ratingOutOf10, numberOfRatings, category, venue, fromDateTime, description, pricesList, termsAndConditions)
        VALUES
        ('Disco', '3.4', '45', 'Adventure; Music;', 'Bombay Hall', strftime('%s','2016-01-27 20:30:50'), 'A dance party', 'Normal: Rs. 50', 'Items lost will not be the concern of the venue host.');


    insert into Event 
        (name, ratingOutOf10, numberOfRatings, category, venue, fromDateTime, description, pricesList, termsAndConditions)
        VALUES
        ('Trekking', '4.1', '100', 'Outdoors;', 'Sanjay Gandhi National Park', strftime('%s','2016-01-27 08:30'), 'A trek through the wilderness', 'Normal: Rs. 0', 'You must be 18 or more and sign a release.');


    select * from event where fromDateTime > strftime('%s','2016-01-27 20:30:49');

我喜欢这个解决方案,因为它非常容易使用编程语言,无需过多考虑 SQLite 的 DATE、TIME、DATETIME 等数据类型所涉及的各种格式。

于 2016-04-01T17:41:36.453 回答
1

strftime总是生成四位数的年份,所以你必须使用substr截掉前两位数:

... WHERE RN_CREATE_DATE = strftime('dd-mm-', '2012-07-28 12:04:34') ||
                           substr(strftime('%Y %H:%M:%S', '2012-07-28 12:04:34'), 3)

以 SQLite 直接理解的格式存储列值会更容易。

于 2012-09-13T20:55:48.030 回答
0

strftime('%Y', '2012-07-28 12:04:34')返回2012,如:

sqlite> select strftime('%Y', '2012-07-28 12:04:34');
2012

但 RN_CREATE_DATE 是 datetime 类型,它需要一个完整的 datetime,如“2012-07-28 12:04:34”。你想要的可能很简单:

SELECT  RN_CREATE_DATE 
FROM DISPOSITION 
WHERE  RN_CREATE_DATE='2012-07-28 12:04:34'
于 2012-09-13T12:50:33.027 回答