我希望获取特定值范围内的记录。这些记录在名为Product
的表中可用。此表将此字段用作过滤器:
假设我想获取所有具有过滤器的记录:
总记录为:
| id | price | datetime |
| 1 | 2 | 01/04/2018 00:00:00 |
| 2 | 5 | 03/04/2018 00:00:00 |
| 3 | 1 | 03/04/2018 00:00:00 |
| 4 | 50 | 02/04/2018 00:00:00 |
| 5 | 10 | 03/04/2018 00:00:00 |
根据指定的过滤器,我应该获得此记录(ID):5, 10
。
我写了这个问题:
m_dbConnection = new SQLiteConnection("Data Source=products.sqlite;Version=3;");
m_dbConnection.Open();
m_dbCommand = new SQLiteCommand("SELECT * FROM Product WHERE " +
"price BETWEEN :min_price AND :max_price AND " +
"datetime BETWEEN :start_date AND :end_date", m_dbConnection );
m_dbCommand.Parameters.Add("min_price", DbType.Decimal).Value = 5;
m_dbCommand.Parameters.Add("max_price", DbType.Decimal).Value = 10;
m_dbCommand.Parameters.Add("start_date", DbType.DateTime).Value = new DateTime(2018, 04, 01);
m_dbCommand.Parameters.Add("end_date", DbType.DateTime).Value = new DateTime(2018, 04, 03);
m_dbCommand.Prepare();
var reader = m_dbCommand.ExecuteReader();
while(reader.Read())
{
} //<- Breakpoint here
代码永远不会进入循环,因此查询不会返回任何结果。 我在查询中做错了什么?
更新
我发现查询根本不使用相同的日期intervall,因此如果我指定为start_date
而end_date
与03/04/2018 00:00:00
相同,则查询不会返回任何结果。相反,如果我设置为start_date: 03/04/2018 00:00:00
,则设置为end_date: 04/04/2018 00:00:00
,这将起作用。
我尝试使用此代码修复此问题:
SELECT * FROM Product WHERE price BETWEEN :min_price AND :max_price AND datetime BETWEEN DATE(:start_date) AND DATE(:end_date)
并尝试仅将格式设置为Date
(但问题为time
):
m_dbCommand.Parameters.Add("start_date", DbType.Date).Value = new DateTime(2018, 04, 03).Date.ToString("yyyy-MM-dd");
m_dbCommand.Parameters.Add("end_date", DbType.Date).Value = new DateTime(2018, 04, 03).Date.ToString("yyyy-MM-dd");
我的解决方案根本不起作用。
答案 0 :(得分:2)
更改参数的类型,您尝试对日期时间字段使用小数。
答案 1 :(得分:0)
尝试在保存到数据库之前格式化日期值。因为您的日期字段的值为01/04/2018 00:00:00
,并且您通过值来检查条件为new DateTime(2018, 04, 01)
。这是01/Apr/2018
。根据您的数据库值(01/04/2018 00:00:00
)显然不等于您的参数值(01/Apr/2018
)..所以在将日期值保存到数据库之前,您应该按照您想要的格式进行格式化。
尝试在插入或更新查询中使用此方法Format(New Date(2017, 4, 5), "dd/MM/yyyy")
...这是存储日期的方式,没有时间,然后继续查询