SQL日期范围查询之间的查询适用于某些表,而不适用于其他表

时间:2017-03-08 10:29:00

标签: sql vb.net datetime ms-access select

我有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值)

enter image description here

促销价格(日期范围)

enter image description here

3 个答案:

答案 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)