You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SQL Server 2014中VB.NET无法正确筛选显示指定日期时间的记录求助

解决SQL Server中按日期+时间筛选已到达记录的问题

我看了你的代码,问题主要出在查询逻辑上,还有添加记录时的参数用法也有小坑,咱们一步步来调整:

一、原查询的问题分析

你当前的查询语句是:

SELECT * FROM TABLEOBERGE 
WHERE [DATE_IN] >= CONVERT(date, GETDATE()) 
AND [HOUR_IN] >= convert(time(0),getDate())

这个逻辑存在两个核心问题:

  1. 筛选方向完全搞反:你要显示的是「已到达对应日期和时间的记录」(也就是记录的时间已经过去),但当前查询是在找「今天及以后的日期,且时间晚于当前时间」的未到达记录,和需求完全相反。
  2. 分开判断日期和时间的逻辑漏洞:比如昨天(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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 07:08:04