2012-03-30 23 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只有一個小日期的轉換器功能,所以沒有格式良好的日期不能或不會正確轉換