如何使用 VB.Net DateTimePicker 从 SQL 服务器获取数据

How to fetch data from SQL Server using VB.Net DateTimePicker

我的项目遇到了挑战。

我需要检索设定日期和时间之间的销售交易。例如(从 1/3/2021 的 2:00 下午到 2/3/2021 的 8:00 上午)。

这是 VB.net 2015 和 SQl Server 2012。

日期由日期时间选择器工具提供,关联的 SQL 列类型为“日期时间”(2021-03-02 16:27:33.233)。

这是我尝试过的:

Dim tbls As New DataTable()
' cmd = New SqlCommand("Select * from RECEIPTS  WHERE Time BETWEEN @dafrom AND @dato ORDER BY 'Receipt_No'", con)
cmd = New SqlCommand("Select * from RECEIPTS WHERE Date Between @Stim And @Etim ORDER BY 'Receipt_No'", con)
      
cmd.Parameters.Add("@Stim", SqlDbType.DateTime).Value = Datefrom.Value
cmd.Parameters.Add("@Etim", SqlDbType.DateTime).Value = DateTo.Value

Dim adapter As New SqlDataAdapter(cmd)
adapter.Fill(tbls)

我启用了 DateTimePicker 的时间部分以允许我设置时间,但我的查询仅基于日期部分的 returns 行,没有时间。

完全是猜测,但我猜测你说的是最后一个日期的数据丢失了。例如,如果您将 select 2021-01-012021-01-31 作为输入参数,则不会返回值为 2021-01-31T17:00:00 的行。

原因很简单,因为 2021-01-31T17:00:00 而不是 BETWEEN2021-01-012021-01-31;因为 2021-01-31 实际上是 2021-01-31T00:00:00.

处理日期和时间值时,最好使用 >=< 的明确日期边界。这意味着您的查询可能应该如下所示:

cmd = New SqlCommand("SELECT {Explicitly define your columns} FROM dbo.RECEIPTS WHERE [Date] >= @Stim AND [Date] < DATEADD(DAY,1,@Etim) ORDER BY Receipt_No;", con)

我也更改了 ORDER BY 'Receipt_No',因为它没有意义;它还不如阅读 ORDER BY 'What ever you like SQL Server. Any arbitrary value will do.'。列名不用单引号 (');单引号用于文字字符串。 T-SQL中对象的分隔标识符是括号([]),但是它也支持ANSI-SQL的双引号(").

because i only need the time part of the control to filter my transaction table.

为了从 DateTime 中提取时间,您可以使用

yourDateTime.ToString("HH:mm:ss")

或者

yourDateTime.ToShortTimeString()

例如,

Dim d = New DateTime(2021, 3, 2, 16, 27, 33)
Dim time = d.ToString("HH:mm:ss")  ' 16:27:33
Dim tm = d.ToShortTimeString()     ' 4:27 PM

谢谢大家,我终于找到了解决问题的方法。

我意识到 datetimepicker 正在发送日期和时间,而且我在 SQL Db 中使用 datetime 类型,所以我只使用 2 Datattime picker(即 Date from adn Date To)并且我更改了格式 属性 自定义。然后我将它设置为 (MM/dd/yyyy hh:mm:ss tt) 我的问题就解决了。