2012-03-30 49 views
1

我想按日期从SQLite数据库中获取条目。无效的Timestring格式的SQLite日期比较

SQLite的有效TIMESTRING格式列出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对象?

+0

','用于30分之3/ 12'? – mellamokb 2012-03-30 15:34:20

+0

@mellamokb例如:我想选择日期大于30/03/2012的所有条目。 – Odys 2012-03-30 15:45:31

回答

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

而且它被用作:通过date`手段,例如

var selectCommand = new SQLiteCommand("SELECT * " + 
    FromClausePartForDateComparisson("TABLENAME", "DATE", "ID", from, to) + 
    @"WHERE [email protected]"; 
0

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

据我所知,你有三种选择(在我的优先顺序排列):

  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错综复杂得到它使用"out of the box" functions完成。

  3. Create a function你自己。

0

,你可以通过使用一些conventons 尝试保存日期相同的格式比较SQLITE日期

SQLITE使用3周的DateFormats(不是真的格式,但使用的) * String作为提及(YYYY- MM-DD [HH:MI:SS]) *整数 *实时

我大多使用真正的被用于比较 他们必须由儒略日被保存()函数日期字段

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