在数据库中获取日期时出错(BETWEEN 子句| VB.NET|OLE)

Posted

技术标签:

【中文标题】在数据库中获取日期时出错(BETWEEN 子句| VB.NET|OLE)【英文标题】:Error in getting Dates in database (BETWEEN Clause| VB.NET|OLE) 【发布时间】:2009-12-07 06:47:02 【问题描述】:

不久之前,我使用代码从数据库中获取两个日期之间的日期(日期为 dd/mm/yy 的列),我认为第一次效果很好,代码是:

      Dim b As New Date
            Dim a As Integer
            a = Val(tx2.Text)
            b = System.DateTime.Today
            b = b.AddDays(-a)

             MsgBox(b)
 Conn.Open()
  SQLstr = " Select * from tb where lastvstart BETWEEN #01/01/1800# AND #" & b & "#"
 Dim DataAdapter1 As New OleDbDataAdapter(SQLstr, Conn)
   DataSet1.Clear()

        DataAdapter1.Fill(DataSet1, "Tb")
        Conn.Close()

如你所见,代码让用户插入一个数字并减去它形成今天的日期,然后计算我想要的日期,然后我使用 BETWEEN 子句获取它们之间的所有日期

但是现在,这段代码获取了一些数据并超过了其他的,我的意思是一些日期在两个日期之间,但代码永远不会得到它,为什么会发生这种情况?

【问题讨论】:

@Tony Toews 我相信 ms-access-2007 和其他标签一样重要,因为它被广泛使用。 当然,问题根本与 Access 无关,因为只有 Jet/ACE 正在使用中。但是下面cmets中的原始问题表明他使用的是A2007,所以我认为2007标签是合适的,如果该标签应该存在的话(而且我不相信版本特定的标签应该首先存在)。 @David W. Fenton:“当然,问题根本与 Access 无关,因为只有 Jet/ACE 在使用”——当然是:Access 数据库引擎。如果您列举“ACE”可能会有所帮助——“A”现在代表什么?包括微软在内的全世界都将引擎称为“Access”。为什么 *** 应该有所不同? 【参考方案1】:

如果您查看生成的 SQL 字符串,它是否包含您期望的日期?我假设数据库要求它遵循特定的格式(dd/MM/yyyyMM/dd/yyyy 给定查询中的硬编码日期)。当日期的字符串版本被创建并插入到您的 SQL 查询中时,您的日期和月份会切换位置吗?

作为旁注,我强烈建议不要像这样将 SQL 查询连接在一起。如果可能,请改用参数化查询。这也可能消除一些类型转换问题。

更新 下面是通过 OLE DB 对 Access 数据库使用参数化查询的示例:

Using connection As New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=""C:\path\file.mdb""")
    Using cmd As New OleDbCommand("select * from tb where lastvstart BETWEEN ? AND ?", connection)

        Dim param As OleDbParameter

        ' add first date '
        param = New OleDbParameter()
        param.DbType = DbType.Date
        param.Value = New DateTime(1800, 1, 1)
        cmd.Parameters.Add(param)

        'add second date '
        param = New OleDbParameter()
        param.DbType = DbType.Date
        param.Value = DateTime.Today.AddDays(-a)
        cmd.Parameters.Add(param)
        cmd.Parameters.Add(New OleDbParameter())

        connection.Open()
        Using adapter As New OleDbDataAdapter(cmd)
            Using ds As New DataSet()
                adapter.Fill(ds)
                Console.WriteLine(ds.Tables(0).Rows.Count)
            End Using ' DataSet ' 
        End Using ' OleDbDataAdapter '
    End Using ' OleDbCommand '
End Using ' OleDbConnection ' 

【讨论】:

如何使用参数化查询,我是大一新生:P 我找到并“添加”参数但从未找到更新? 参数化查询可能是一个巨大的痛苦。大约 15 年来,我一直在使用 VBA 代码中连接的查询,它们工作得很好。 @Tony Toews:让真正确保输入是干净的,或者在有人使用安全漏洞之后进行清理也可能是一团糟。【参考方案2】:

能不能不把Sqlstr改成

SQLstr = " Select * from tb where lastvstart <= '" & b.ToString("dd MMM yyyy") & "'";

编辑,根据数据库更改

使用这个字符串并检查它是否有效

SQLstr = " Select * from tb where lastvstart <= #" & b.ToString("dd MMM yyyy") & "#";

【讨论】:

当我使用这段代码时,编译器会高亮显示以下代码:DataAdapter1.Fill(DataSet1, "Tb") 并告诉我数据类型不一样?有什么问题? 您使用的是哪个数据库? 检查编辑的答案,MS ACCESS 日期与 Sql Server 日期略有不同 我使用了参数,它解决了问题,谢谢你。

以上是关于在数据库中获取日期时出错(BETWEEN 子句| VB.NET|OLE)的主要内容,如果未能解决你的问题,请参考以下文章

生成一个mysql BETWEEN子句以在日期范围内查找

在 NodeJS 中使用 BETWEEN 子句

使用“BETWEEN”检索字段时出错

在 ROWS BETWEEN 子句的存储过程中使用变量

Oracle Between(范围)子句

Oracle Between(范围)子句