关于非有效Timestring格式的SQLite日期比较

时间:2012-03-30 14:56:40

标签: c# .net-3.5 sqlite

我希望按日期从SQLite数据库中获取条目。

SQLite有效时间字符串格式列为here

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 :(得分:0)

Sqlite不支持比较日期(和日期时间),特别是“开箱即用”。

据我所知,您有三种选择(按照我的喜好排列):

  1. 使用适合基于字符串的比较的格式(例如YYYYMMDD)。这是让你入门的东西:

    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使用"out of the box" functions完成此操作。

  3. Create a function自己。

答案 1 :(得分:0)

您可以使用一些conventons来比较SQLITE中的日期 尝试以相同的格式保存日期

SQLITE使用3个Dateformats(不是realy格式,而是使用的格式) *提到的字符串(YYYY-MM-DD [HH:MI:SS]) * 整数 *真实

我主要使用real作为用于比较的日期字段 它们必须由julianday()函数

保存

最大的问题是,SQLITE只有一个小日期转换器功能,所以没有格式良好的日期不能或不会被正确转换

答案 2 :(得分:0)

我做了一个非常快速的查询,我为此感到自豪:p。所以这就是:

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