如何在sqlite中查询不同的日期格式

时间:2012-09-13 12:29:29

标签: sql sqlite

我在移动设备和我的数据库中使用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 个答案:

答案 0 :(得分:25)

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

答案 1 :(得分:3)

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

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

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

具体地说,假设我想要一个事件表,用于音乐会等事件。我想在事件开始时存储fromDateTime字段。我可以通过将fromDateTime字段设置为INTEGER类型来实现:

createdDate

现在,让我们使用SQLite DateTime字段来使用UNIX纪元:

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                
);

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

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

我喜欢这个解决方案,因为它很容易使用编程语言,而不必过多考虑SQLite的DATE,TIME,DATETIME等数据类型中涉及的各种格式。

答案 2 :(得分: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直接理解的格式存储列值会更容易。

答案 3 :(得分: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类型,期望完整的日期时间,例如“2012-07-28 12:04:34”。你想要的可能只是:

SELECT  RN_CREATE_DATE 
FROM DISPOSITION 
WHERE  RN_CREATE_DATE='2012-07-28 12:04:34'