[英]VB.net SQL Datepicker select date from dropdown but manually specify time
我有兩個日期字段下拉列表,最終用戶將從中選擇他們的開始和結束日期。 但是,當我運行查詢時,我錯過了第一個日期,即 - 我選擇了 9th-15th 但我得到了 10th-15th 記錄。
我的想法是以某種方式從下拉菜單中獲取一天並手動硬編碼開始和結束時間(00:00:00 和 24:00:00)
我想我可能可以做到與此類似,但我的代碼不起作用。
Private Sub FindItem2()
SQL2.AddParam("@datestart", dateStart.Value.ToShortDateString + '00:00:00')
SQL2.AddParam("@dateend", dateEnd.Value.ToShortDateString + '24:00:00')
LoadGrid("SELECT SUBSTRING(CustomerNumber, PATINDEX('%[^0]%', CustomerNumber+'.'), LEN(CustomerNumber)),'D','CAFET','', sum(Total) as totalsales FROM ViewDetailedSalesReport WHERE CustomerNumber is not null AND DateSold BETWEEN (@datestart) AND (@dateend) GROUP BY CustomerNumber, CustomerLastName ORDER BY CustomerLastName ASC; ")
End Sub
編輯新:
我刪除了我的代碼,而不是嘗試修改它。 我使用了 Cetin 的代碼並通過將變量移到頂部、刪除標簽並在 Query 周圍添加引號來調整它。 之后它就可以工作了,而且完全正常。
Private Sub FindItem2()
SQL2.AddParam("@datestart", dateStart2.Value.Date)
SQL2.AddParam("@dateend", dateEnd2.Value.Date.AddDays(1))
Dim cmd As String = "SELECT SUBSTRING(CustomerNumber, PATINDEX('%[^0]%', CustomerNumber+'.'),
LEN(CustomerNumber)),
'D','CAFET','',
sum(Total) as totalsales
FROM ViewDetailedSalesReport
WHERE CustomerNumber is not null AND
DateSold >= @datestart AND DateSold <@dateend
GROUP BY CustomerNumber, CustomerLastName
ORDER BY CustomerLastName ASC;"
LoadGrid(cmd)
End Sub
EDIT-OLD:我讓查詢“正確”工作,但是我不確定這是完成此任務的最佳實踐方法。
Private Sub FindItem2()
SQL2.AddParam("@datestart", dateStart2.Value)
SQL2.AddParam("@dateend", dateEnd2.Value)
LoadGrid("SELECT SUBSTRING(CustomerNumber, PATINDEX('%[^0]%', CustomerNumber+'.'), LEN(CustomerNumber)),'D','CAFET','', sum(Total) as totalsales FROM ViewDetailedSalesReport WHERE DateSold >= DateAdd(day,-1,@datestart) AND DateSold < (@dateend) GROUP BY CustomerNumber, CustomerLastName ORDER BY CustomerLastName ASC; ")
End Sub
我按照 Cetin 的建議使用 >= 和 < 而不是 BETWEEN 修改了該部分,並使用 DateAdd 將 dayoffset 更改為 -1。
DateSold >= DateAdd(day,-1,@datestart) AND DateSold < (@dateend)
這是嘗試將 DateTime 值轉換為字符串並在 MS SQL Server 中使用 between 使用 DateTime 范圍檢查的錯誤。 之間就像說 x >= y 和 x <= z,換句話說,它包含 y 和 z。 相反,它應該是一個查詢,表示 x >= y 和 x < z(其中 y 和 z 是開始和結束日期)。
Private Sub FindItem2()
dim cmd as string = <sql>SELECT SUBSTRING(CustomerNumber, PATINDEX('%[^0]%', CustomerNumber+'.'),
LEN(CustomerNumber)),
'D','CAFET','',
sum(Total) as totalsales
FROM ViewDetailedSalesReport
WHERE CustomerNumber is not null AND
DateSold >= @datestart AND DateSold < @dateend
GROUP BY CustomerNumber, CustomerLastName
ORDER BY CustomerLastName ASC;
</sql>
SQL2.AddParam("@datestart", dateStart.Value.Date)
SQL2.AddParam("@dateend", dateEnd.Value.Date.AddDays(1))
LoadGrid(cmd)
End Sub
我假設在您的示例代碼中 .AddParam 正在執行以下操作:
sqlCommand.Parameters.Add("@dateStart", SqlDbType.Date).Value = dateStart.Value.Date
loadgrid 類似於 dataTable.Load(sqlCommand.ExecuteReader)。
編輯:不確定那些 SQL2.AddParam 和 LoadGrid 是什么。 這是一個示例:
Dim sql As String = "SELECT SUBSTRING(CustomerNumber, PATINDEX('%[^0]%', CustomerNumber+'.'),
LEN(CustomerNumber)),
'D','CAFET','',
sum(Total) as totalsales
FROM ViewDetailedSalesReport
WHERE CustomerNumber is not null AND
DateSold >= @datestart AND DateSold <@dateend
GROUP BY CustomerNumber, CustomerLastName
ORDER BY CustomerLastName ASC;"
Dim tbl As DataTable = New DataTable()
Using cn As SqlConnection = New SqlConnection("server=.\SQLExpress;Database=YourDb;Trusted_Connection=yes")
Using cmd As SqlCommand = New SqlCommand(sql, cn)
cmd.Parameters.Add("@datestart", SqlDbType.Date).Value = dateStart.Value.Date
cmd.Parameters.Add("@dateend", SqlDbType.Date).Value = dateEnd.Value.Date.AddDays(1)
cn.Open()
tbl.Load(cmd.ExecuteReader())
cn.Close()
End Using
End Using
' Do whatever with datatable
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.