运算符之间返回空结果

时间:2018-04-03 08:54:56

标签: sql sqlite

我希望获取特定值范围内的记录。这些记录在名为Product的表中可用。此表将此字段用作过滤器:

  • MIN_PRICE
  • MAX_PRICE
  • 起始日期
  • END_DATE

假设我想获取所有具有过滤器的记录:

  • min_price = 5
  • max_price = 10
  • start_date = 03/04/2018
  • end_date = 03/04/2018

总记录为:

  | 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_dateend_date03/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");

我的解决方案根本不起作用。

2 个答案:

答案 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") ...这是存储日期的方式,没有时间,然后继续查询