2017-03-08 40 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) 
相關問題