我有6个数据库表格存储有关佣金率的信息以及使用哪种费率(取决于客户/供应商/产品和订单日期)。SQL日期范围查询适用于某些表格,但不适用于其他表格
使用这些表格,我有一个过程来计算由于用户的佣金数额。这工作正常秩序的第一阶段,因为它使用当前的日期,所以我SQL
是沿
Dim p1Dt As New DataTable
Dim pDa As New OleDbDataAdapter("SELECT * FROM [Promotional Rates] WHERE Supp_Code=? AND " & _
"Product_Code=? AND Rate_Start_One <= DATE() AND " & _
"Rate_End_One >= DATE()", con)
pDa.SelectCommand.Parameters.Add("@supplier", OleDbType.VarChar).Value = cmbSupplier.Text
pDa.SelectCommand.Parameters.Add("@product", OleDbType.VarChar).Value = ugr.Cells("Product_Code").Value
pDa.Fill(p1Dt)
然而行,当订单已交付,该委员会随后与重新计算该产品的交货日期取自数据库。
我这样做的代码有点不同,因为它没有使用当前日期进行计算。相反,我使用此代码
Dim deliveryDate As Date
deliveryDate = ugr.Cells("Final_Delivery").Value
Dim p1Dt As New DataTable
Dim pDa As New OleDbDataAdapter("SELECT * FROM [Promotional Rates] WHERE Supp_Code=? " & _
"AND Product_Code=? AND Rate_Start_One <= #" & _
deliveryDate & "# AND Rate_End_One >= #" & _
deliveryDate & "#", con)
pDa.SelectCommand.Parameters.Add("@supplier", OleDbType.VarChar).Value = cmbSupplier.Text
pDa.SelectCommand.Parameters.Add("@product", OleDbType.VarChar).Value = ugr.Cells("Product_Code").Value
pDa.Fill(p1Dt)
如果我救Final_Delivery
值为2017年11月3日(3月11日),该deliveryDate
值被指定为2017年11月3日。
我对3月份的所有表格有Promotional Rates
表格的费率,所以我期望上面的查询在表格中有1行,但是它返回0,所以使用了错误的佣金值。
当我使用DATE()
方法时,它不会发生这种情况,它会正确地查找表中的所有行,所以问题在于我在第二种方法中输入日期的方式。
当我以这种格式编写查询时,为什么第二个方法在数据库中找不到该行?
编辑
这是一个完整CommandText
,在数据库中悬停在OleDbDataAdapter
变量,复制和粘贴CommandText
"SELECT * FROM [Promotional Rates] WHERE Supp_Code=? AND Product_Code=? AND Rate_Start_One " & _
"<= #11/03/2017# AND Rate_End_One >= #11/03/2017#"
的数据后,证明它有正确的日期在:
销售线(对于Final_Delivery
值)
促销价格(日期范围)
您使用了供应商和产品的参数,您可以/应该提供日期作为日期参数。格式和文化不再重要(只要它们是DB中的日期)。 – Plutonix