我有6个数据库表,存储佣金率和使用率,具体取决于客户/供应商/产品和订单日期。
使用这些表格,我有一个程序来计算用户的佣金金额。这适用于订单的第一阶段,因为它使用当前日期,所以我的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
值保存为11/03/2017(3月11日),则deliveryDate
值将被指定为11/03/2017。
我在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
值)
促销价格(日期范围)
答案 0 :(得分:2)
答案是,正如@Plutonix所提到的,以及另一个论坛中的其他人 - 使用参数传递日期。
事实上,我完全忘记了这是可能的,但解决问题的方法是参数化,例如:
Dim deliveryDate As Date = 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 <= ? AND Rate_End_One " & _
">= ?", 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.SelectCommand.Parameters.Add("@dFrom", OleDbType.Date).Value = deliveryDate
pDa.SelectCommand.Parameters.Add("@dTo", OleDbType.Date).Value = deliveryDate
pDa.Fill(p1Dt)
答案 1 :(得分:0)
无论您的区域设置是什么,Access都会将SQL字符串中的日期解释为mm / dd / yyyy。请阅读http://allenbrowne.com/ser-36.html以了解处理它的一些方法。
在查询设计器中,这不适用 - 这非常令人困惑。无论你在哪里使用它,它都会正确解释Date()。
答案 2 :(得分:0)
你的SQL应该是:
"SELECT * FROM [Promotional Rates] WHERE Supp_Code=? AND Product_Code=? AND Rate_Start_One " & _
"<= #2017/03/11# AND Rate_End_One >= #2017/03/11#"
所以修改如下:
Dim pDa As New OleDbDataAdapter("SELECT * FROM [Promotional Rates] WHERE Supp_Code=? " & _
"AND Product_Code=? AND Rate_Start_One <= #" & _
deliveryDate.ToString("yyyy'/'MM'/'dd") & "# AND Rate_End_One >= #" & _
deliveryDate.ToString("yyyy'/'MM'/'dd") & "#", con)