C# 带有C的SQLite数据库无法比较datetime数据类型
我正在使用C.NET和SQLite数据库。 我在SQLite数据库中有一个表,其中有一个名为InvoiceDate的列。我在db表中选择了与文本相同的数据类型,因为我需要它作为datetime变量 我正在使用System.Data.SQLite引用 以下是我面临问题的命令文本:C# 带有C的SQLite数据库无法比较datetime数据类型,c#,database,sqlite,datetime,C#,Database,Sqlite,Datetime,我正在使用C.NET和SQLite数据库。 我在SQLite数据库中有一个表,其中有一个名为InvoiceDate的列。我在db表中选择了与文本相同的数据类型,因为我需要它作为datetime变量 我正在使用System.Data.SQLite引用 以下是我面临问题的命令文本: command.CommandText = "SELECT * FROM InvoiceMaster WHERE InvoiceDate BETWEEN '" + date1.
command.CommandText = "SELECT * FROM InvoiceMaster WHERE InvoiceDate BETWEEN '"
+ date1.ToString() + "' AND '"
+ date2.ToString() + "' ORDER BY InvoiceNumber";
我需要找到InvoiceDate列位于给定日期date1和date2之间的所有结果。但问题是,即使我选择了其他日期,我也会得到结果。例如,即使我选择了不同的年份,我在同一个月份和日期也会得到相同的结果。命令文本有问题,我还需要知道应该在db表中选择什么类型的数据类型。请务必让我知道如何编写select命令。来自
文本为ISO8601字符串YYYY-MM-DD HH:MM:SS.SSS
由于ToString不生成这种格式,您可以使用自定义格式,如
date1.ToString("yyyy-MM-dd HH:mm:ss.fff", CultureInfo.InvariantCulture)
date2.ToString("yyyy-MM-dd HH:mm:ss.fff", CultureInfo.InvariantCulture)
但更重要的是,您应该始终使用。这种类型的字符串连接对攻击是开放的
我对格式不是百分之百的了解,但你可能想用哪一种表示
。。使用保留的模式的自定义日期和时间格式字符串
时区信息,并发出符合ISO的结果字符串
8601
您可以创建一个方法来转换日期时间
private string DateTimeSQLite(DateTime datetime)
{
string dateTimeFormat = "{0}-{1}-{2} {3}:{4}:{5}.{6}";
return string.Format(dateTimeFormat, datetime.Year,
datetime.Month,datetime.Day,
datetime.Hour, datetime.Minute,
datetime.Second,datetime.Millisecond);
}
或者最好将其作为一种扩展方法
private static string DateTimeSQLite(this DateTime datetime)
{}
还可以使用参数化查询来避免sql注入
string commandText = "SELECT * FROM InvoiceMaster
WHERE InvoiceDate BETWEEN @date1 and @date2
ORDER BY InvoiceNumber"
yourcommand.Parameters.Add("@date1",date1.DateTimeSQLite());
yourcommand.Parameters.Add("@date2",date1.DateTimeSQLite());
由于您已选择将日期存储为数据库中的文本字段,因此必须使用ISO8601对其进行格式化。例如:
2016-02-03T20:34:22Z
因此,一旦确保它们以这种方式存储,剩下的就是对查询进行参数化:
DateTime date1 = ... get from somewhere
DateTime date2 = ... get from somewhere
using (var conn = new SQLiteConnection("Data Source=mydb.db;Version=3;"))
using (var cmd = conn.CreateCommand())
{
conn.Open();
cmd.CommandText = "SELECT * FROM InvoiceMaster WHERE InvoiceDate BETWEEN @startDate AND @endDate";
cmd.Parameters.AddWithValue("@startDate", date1.ToString("o"));
cmd.Parameters.AddWithValue("@endDate", date2.ToString("o"));
using (var reader = cmd.ExecuteReader())
{
while (reader.Read())
{
// do something with the results here
}
}
}
请注意,我是如何使用.ToStringo格式说明符来确保将日期正确传递到数据库的。使用准备好的语句/参数绑定,您的问题就会得到解决。您能给我一个示例代码吗……您是否先进行了基本搜索?您在提供的链接中有一个示例,只是想在google中找到它……您需要正确设置日期字符串的格式……我认为这不是一个好主意,因为一位数的月、日、时、分和秒部分不会有前导零。这很有趣,因为格式为yyyy mm ddThh:mm:ss[.mmm]。SQLite文档表明T不是本标准的一部分。ISO 8601与区域性无关。但不是以SQLite文档中显示的格式。请检查并纠正一个@lad2025你有一个观点,但我写了这个格式,因为医生这么说。我从来没有诚实地使用过Sqlite,这就是为什么我不能百分之百确定。尝试了以下操作:command.CommandText=SELECT*FROM InvoiceMaster,其中InvoiceDate介于“DATETIME+date1.ToString yyyy-MM-dd HH:MM:ss.fff,CultureInfo.InvariantCulture+”和“DATETIME+date2.ToString yyy-MM-dd HH:MM:ss.fff,CultureInfo.InvariantCulture+”;还是没有WORK@SlickGuy我更新了我的答案。你能看一下吗?
DateTime date1 = ... get from somewhere
DateTime date2 = ... get from somewhere
using (var conn = new SQLiteConnection("Data Source=mydb.db;Version=3;"))
using (var cmd = conn.CreateCommand())
{
conn.Open();
cmd.CommandText = "SELECT * FROM InvoiceMaster WHERE InvoiceDate BETWEEN @startDate AND @endDate";
cmd.Parameters.AddWithValue("@startDate", date1.ToString("o"));
cmd.Parameters.AddWithValue("@endDate", date2.ToString("o"));
using (var reader = cmd.ExecuteReader())
{
while (reader.Read())
{
// do something with the results here
}
}
}