2017-03-08 103 views
0

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

enter image description here

促销价格(日期范围)

enter image description here

+2

您使用了供应商和产品的参数,您可以/应该提供日期作为日期参数。格式和文化不再重要(只要它们是DB中的日期)。 – Plutonix

回答

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) 
+0

嗨,大卫,谢谢你对Stack Overflow的贡献!但是,请不要进行[像这样的编辑](/ review/suggestions-edits/15485370)。特别是,“iOS”不是程序代码,因此不应该封装在[backticks](/ editing-help#code)中。请参阅[这个答案meta.SO](https://meta.stackoverflow.com/a/303220)关于如何正确编辑帖子(和[这个问题])的指导(https://meta.stackoverflow.com/q/ 313517)查看一些编辑的例子,这些例子是* not * helpful)。谢谢! (Ps。我会在几天内删除这条评论,以免它永远混淆这个答案。) –

0

访问解释在SQL字符串作为MM/DD/YYYY日期无论区域设置是什么。请阅读http://allenbrowne.com/ser-36.html以了解处理它的一些方法。

在查询设计器中,这不适用 - 这很混乱。无论您在何处使用它,它都能正确解释Date()。

+0

这并没有多大意义 - 你确定你的数据中有你正在寻找的日期吗?而且在任何值中都没有时间分量? – Minty

+0

好的 - 第一个日期将被读作14/03/2017,因为它不能是其他任何东西,然而第二个日期将被读作03/11/2017例如因为我上面描述的效果。您必须强制所有日期以mm/dd/yyyy格式才能正常工作 – Minty

+0

但是,在两种情况下都会返回0行。 – David

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) 
相关问题