Сравнение дат в SQLite для недопустимых форматов временных рядов - PullRequest
1 голос
/ 30 марта 2012

Я хочу получить записи из базы данных SQLite по дате.

Допустимые форматы временных рядов SQLite перечислены здесь как:

YYYY-MM-DD
YYYY-MM-DD HH:MM
YYYY-MM-DD HH:MM:SS
YYYY-MM-DD HH:MM:SS.SSS
YYYY-MM-DDTHH:MM
YYYY-MM-DDTHH:MM:SS
YYYY-MM-DDTHH:MM:SS.SSS
HH:MM
HH:MM:SS
HH:MM:SS.SSS
now
DDDD.DDDD 

У меня есть другой формат в базе данных, D/M/YYYY

Есть ли способ сравнить даты в этой базе данных (и соответственно выбрать записи) без необходимости выбирать, анализировать и сравнивать все объекты DateTime из всех строк таблицы?

Ответы [ 3 ]

0 голосов
/ 02 апреля 2012

вы можете сравнивать даты в SQLITE, используя некоторые условные обозначения попробуйте сохранить даты в том же формате

SQLITE использует 3 формата даты (не форматы, а использованные) * Строка, как указано (ГГГГ-ММ-ДД [ЧЧ: МИ: СС]) * Целое число * Реальный

Я в основном использую real для полей даты, которые используются для сравнения Они должны быть сохранены функцией julianday ()

Самая большая проблема в том, что SQLITE имеет только небольшую функцию конвертера дат, поэтому неправильно сформированные даты не могут или не будут правильно конвертироваться

0 голосов
/ 07 сентября 2012

Я сделал действительно БЫСТРЫЙ запрос, и я горжусь этим: с.Итак, вот оно:

    public static string FromClausePartForDateComparisson(string tableName, string dateFieldName, string idFieldName, DateTime from, DateTime to)
    {
        string clause = string.Format(@" from 
           (SELECT {0} as filteredId,
                Substr('00'|| -- make day with two digits
                    CASE Substr({1}.{2}, 3, 1)
                        WHEN '/' THEN Substr({1}.{2}, 1, 2)
                        ELSE Substr({1}.{2}, 1, 1)
                    END, -2, 2) AS DAY,
                Substr('00'|| -- make month with two digits
                    CASE Length({1}.{2})
                        WHEN 8 THEN Substr({1}.{2}, 3, 1)
                        WHEN 9 THEN CASE Substr({1}.{2}, 3, 1)
                                        WHEN '/' THEN Substr({1}.{2}, 4, 1)
                                        ELSE Substr({1}.{2}, 3, 2)
                                    END
                        WHEN 10 THEN Substr({1}.{2}, 4, 2)
                    END, -2, 2) AS MONTH,
                Substr({1}.{2}, Length({1}.{2}) - 3, 4) AS YEAR
            FROM   {1}
            WHERE  Strftime('%Y%m%d', YEAR||'-'||MONTH||'-'|| DAY) BETWEEN
                    Strftime('%Y%m%d', '{3}') AND
                    Strftime('%Y%m%d', '{4}')) AS filteredtable
            INNER JOIN {1} ON filteredtable.filteredId = {1}.{0} ", idFieldName, tableName, dateFieldName, from.ToString("yyyy-MM-dd"), to.ToString("yyyy-MM-dd"));
        return clause;
    }

И оно используется как:

var selectCommand = new SQLiteCommand("SELECT * " + 
    FromClausePartForDateComparisson("TABLENAME", "DATE", "ID", from, to) +
    @"WHERE ID_TABLENAME=@Id";
0 голосов
/ 31 марта 2012

Sqlite не поддерживает сравнение дат (и datetime), в частности, «из коробки».

Насколько я знаю, у вас есть три варианта (в порядке моих предпочтений):

  1. Используйте формат, который подходит для сравнения на основе строк (например, ГГГГММДД). Вот кое-что, с чего можно начать:

    sqlite> create table foo (d TEXT);
    sqlite> insert into foo values ('02/01/2012');
    sqlite> select substr(d, 7, 4) || substr(d, 1, 2) || substr(d, 4, 2) from foo;
    20120201
    
  2. Используйте запутанный SQL для выполнения, используя функции "из коробки" .

  3. Создайте функцию самостоятельно.

...