【问题标题】:how to query in sqlite for different date format如何在sqlite中查询不同的日期格式
【发布时间】:2012-09-13 12:29:29
【问题描述】:

我将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')

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

【问题讨论】:

  • 有关strftime 的详细信息,请参阅sqlite.org/lang_datefunc.html 的文档。
  • 我检查了文档并尝试了很多东西......我只是很困惑如何对此进行精确查询,因为在我的数据库中我有不同的日期格式和 sqlite strftime 函数获取不同一。
  • @vishalg 也许您想使用详细信息更新问题,最好使用数据库的示例值。

标签: sql sqlite


【解决方案1】:

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

【讨论】:

  • 再一个查询,这对我有用,但如果我只通过日期,那么它不会给出任何结果,为什么..我不想包括时间 SELECT RN_CREATE_DATE FROM DISPOSITION WHERE RN_CREATE_DATE = strftime(' %d-%m-%Y ', '2010-07-28');我想要这个日期的所有记录
  • 我不太明白您的回答或@vishalg 的问题:如果我在表格中存储一个没有时间的日期:insert into t values('item', date('2012-09-13 12:44:22'),您是否希望使用上面的示例选择此项有完整的日期时间信息吗?
【解决方案2】:

我想补充一些关于在 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 等数据类型所涉及的各种格式。

【讨论】:

    【解决方案3】:

    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 直接理解的格式存储列值会更容易。

    【讨论】:

    • 如果我的 RN_CREATE_DATE 列值不是格式 YY-mm-dd HH:MM:SS 并且如果它是格式 dd-mm-YY HH:MM:SS 那么我将如何获得根据查询的值
    • 这个查询格式为dd-mm-YY HH:MM:SS。你现在到底有什么问题?
    【解决方案4】:

    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'
    

    【讨论】:

      猜你喜欢
      • 2015-01-25
      • 1970-01-01
      • 2014-06-03
      • 2015-03-05
      • 2023-01-21
      • 2013-10-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多