как запросить в 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 ответов


strftime работает так:

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

если вы хотите использовать его в WHERE предложение, заменить datetime('now') С datetime вы хотите соответствовать в .

пример:

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

Я хотел бы добавить некоторые сведения об использовании базы данных SQLite даты и времени с эпохи Unix. время:

эпоха UNIX была 00:00: 00 1970-01-01, то есть полночь 1 января 1970 года. Текущее время на машинах UNIX (например, работающих под управлением Linux) измеряется в секундах с того времени.

SQLite поддерживает это время эпохи, и я нашел его очень полезным для использования в качестве формата для поля DateTime в SQLite.

конкретно, предположим, я хочу иметь событие таблица, для событий как концерты etc. Я хочу, чтобы поле 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, время, дата, и т. д. тип данных.


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'

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.