SQL Server 2014中VB.NET无法正确筛选显示指定日期时间的记录求助
解决SQL Server中按日期+时间筛选已到达记录的问题
我看了你的代码,问题主要出在查询逻辑上,还有添加记录时的参数用法也有小坑,咱们一步步来调整:
一、原查询的问题分析
你当前的查询语句是:
SELECT * FROM TABLEOBERGE WHERE [DATE_IN] >= CONVERT(date, GETDATE()) AND [HOUR_IN] >= convert(time(0),getDate())
这个逻辑存在两个核心问题:
- 筛选方向完全搞反:你要显示的是「已到达对应日期和时间的记录」(也就是记录的时间已经过去),但当前查询是在找「今天及以后的日期,且时间晚于当前时间」的未到达记录,和需求完全相反。
- 分开判断日期和时间的逻辑漏洞:比如昨天(5月19日)11点的记录,今天(5月20日)10点时这条记录的时间已经过去,应该被显示,但原查询中
[DATE_IN] >= 今天不成立,会直接漏掉这类记录。正确的做法是把日期和时间合并成一个完整的DateTime,再和当前时间做比较。
二、修正后的查询语句
我们可以把DATE_IN和HOUR_IN合并成完整的时间,再判断它是否小于等于当前时间(即已到达/过去的记录)。在SQL Server里,用DATEADD函数合并的写法兼容性最好:
SELECT * FROM TABLEOBERGE WHERE DATEADD(day, DATEDIFF(day, 0, [DATE_IN]), [HOUR_IN]) <= GETDATE()
简单解释下这个写法:
DATEDIFF(day, 0, [DATE_IN])计算从系统0日期到DATE_IN的总天数DATEADD(day, ..., [HOUR_IN])把这个天数加到HOUR_IN上,得到完整的「日期+时间」DateTime值- 最后和
GETDATE()(当前完整时间)比较,筛选出所有已经过去的记录
这个语句能完美覆盖所有已到达的记录:包括日期早于今天的所有记录,以及今天日期中时间不晚于当前时间的记录。
三、添加记录代码的问题修正
你添加记录的代码里,AddWithValue的用法错了!当前写法:
.AddWithValue("@ID", SqlDbType.Int).Value = TextBox1.Text
AddWithValue的第二个参数应该是参数的实际值,而不是SqlDbType枚举,你这样写会把枚举对应的数字(比如Int类型对应4)当作参数值传入,必然会报错。正确的写法是用Add方法指定类型后再赋值:
' 修正后的参数添加逻辑 With Command.Parameters Command.CommandText = "INSERT INTO [TABLEOBERGE] ([ID], [FIRSTNAME], [PHONE], [ADRESSE], [DATE_OUT], [HOUR_OUT], [DATE_IN], [HOUR_IN]) VALUES (@ID, @FIRSTNAME, @PHONE, @ADRESSE, @DATE_OUT, @HOUR_OUT, @DATE_IN, @HOUR_IN)" .Add("@ID", SqlDbType.Int).Value = Integer.Parse(TextBox1.Text) ' 转成Int类型 .Add("@FIRSTNAME", SqlDbType.NVarChar).Value = TextBox2.Text .Add("@PHONE", SqlDbType.NVarChar).Value = TextBox3.Text .Add("@ADRESSE", SqlDbType.NVarChar).Value = TextBox4.Text .Add("@DATE_OUT", SqlDbType.Date).Value = Date.Parse(TextBox5.Text) ' 转成Date类型 .Add("@HOUR_OUT", SqlDbType.Time).Value = TimeSpan.Parse(TextBox6.Text) ' Time类型对应TimeSpan .Add("@DATE_IN", SqlDbType.Date).Value = Date.Parse(TextBox7.Text) .Add("@HOUR_IN", SqlDbType.Time).Value = TimeSpan.Parse(TextBox8.Text) End With
额外提醒:最好给文本框的转换加TryParse判断,避免用户输入格式错误导致程序崩溃,比如:
If Integer.TryParse(TextBox1.Text, out int id) Then .Add("@ID", SqlDbType.Int).Value = id Else MsgBox("ID格式错误,请输入整数", MsgBoxStyle.Exclamation) Return End If
四、完整的Form1_Load修正代码
把修正后的查询替换进去,代码如下:
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load Dbb_Connection() Using InfoAdapter As New SqlDataAdapter("SELECT * FROM TABLEOBERGE WHERE DATEADD(day, DATEDIFF(day, 0, [DATE_IN]), [HOUR_IN]) <= GETDATE()", StrCon) InfoTable = New DataTable InfoAdapter.Fill(InfoTable) DataGridView1.DataSource = InfoTable End Using End Sub
这样调整后,就能正确显示所有已到达对应日期时间的记录,添加记录的逻辑也不会因为参数类型错误而出问题了。
内容的提问来源于stack exchange,提问作者ABIDINE
相关产品推荐
相关产品推荐

