我希望按日期从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
个对象?
答案 0 :(得分:0)
Sqlite不支持比较日期(和日期时间),特别是“开箱即用”。
据我所知,您有三种选择(按照我的喜好排列):
使用适合基于字符串的比较的格式(例如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
使用复杂的SQL使用"out of the box" functions完成此操作。
答案 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";