我的项目遇到了挑战。
我需要检索设定日期和时间之间的销售事务。(从2021年3月1日下午2点到2021年2月3日上午8点)。
这是一个VB.net 2015与SQl Server 2012。
日期是由Datetime Picker工具提供的,关联的SQL列类型是"Datetime"(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的时间部分,允许我设置时间,但是我的查询只返回基于日期部分的行,而不返回时间。
完全猜测,但我猜测您所说的是最后日期的数据缺失。例如,如果您选择了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的双引号("
)。
因为我只需要控件的时间部分来过滤我的事务表
为了从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(即日期从和日期到),我将格式属性更改为自定义。把它设置为(MM/dd/yyyy hh: MM:ss tt),我的问题就解决了。