如何使用 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-01
和 2021-01-31
作为输入参数,则不会返回值为 2021-01-31T17:00:00
的行。
原因很简单,因为 2021-01-31T17:00:00
是 而不是 BETWEEN
值 2021-01-01
和 2021-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) 我的问题就解决了。
我的项目遇到了挑战。
我需要检索设定日期和时间之间的销售交易。例如(从 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-01
和 2021-01-31
作为输入参数,则不会返回值为 2021-01-31T17:00:00
的行。
原因很简单,因为 2021-01-31T17:00:00
是 而不是 BETWEEN
值 2021-01-01
和 2021-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) 我的问题就解决了。