为啥我的 where 语句没有返回结果?

Posted

技术标签:

【中文标题】为啥我的 where 语句没有返回结果?【英文标题】:Why does my where statement return no results?为什么我的 where 语句没有返回结果? 【发布时间】:2019-02-06 21:51:11 【问题描述】:

我正在使用 Excel VBA 从 Access 数据库中提取数据。我的“Select”和“From”语句工作正常。当我添加“Where”语句时,我没有得到任何结果。你能帮忙吗?!

Dim SDATE As String
Dim EDATE As String
Dim SQLstring As String

SDATE = Application.InputBox("Beginning Date", "Date 1", Format(Date - 31, "MM-DD-YY"))
EDATE = Application.InputBox("Ending Date", "Date 2", Format(Date, "MM-DD-YY"))

SQLstring = "SELECT tblitemhistory.HistDate, tblstockitems.MasterPNo, tblstockitems.ItemDescription, tblitemhistory.HistType, tblitemhistory.HistText, tblitemhistory.HistQty " & _
            "FROM tblitemhistory INNER JOIN tblstockitems ON tblitemhistory.StockID = tblstockitems.ItemID" & _
            "where (((tblitemhistory.HistDate)  between #" & [SDATE] & "# AND #" & [EDATE] & "#"""

getSQLString = SQLstring

我希望在用户输入的两个日期之间提取记录。运行代码时我没有收到任何错误,但我也没有得到任何结果。

【问题讨论】:

能否请您添加Debug.Print getSQLString 的结果,以便我们查看日期的实际日期和格式? • 另请注意,在where (((tblitemhistory.HistDate) between 中,您打开了3 个括号,但您只关闭了一个。因此,您的代码要么不完整,要么无效。 PEH 可能就是这样,以及末尾的 3 个双引号。 【参考方案1】:

尝试从 [SDATE] 和 [EDATE] 中删除括号。这是 SQL 语法,而不是 VBA 语法。

您可能会考虑将格式修改为 mm/dd/yyyy,日期的区域解释可能会让您头疼。

看这个:

https://bytes.com/topic/access/insights/575420-literal-datetimes-their-delimiters

**编辑**

我刚刚意识到您并没有终止所有这些括号:(((tblitemhistory.HistDate)。你不需要它们中的任何一个。此外,末尾有 3 个引号会在查询末尾添加一个您可能不想要的引号,请尝试 "where tblitemhistory.HistDate BETWEEN #" & SDATE & "# AND #" & EDATE & "#"

【讨论】:

感谢您的建议,但我在运行代码时得到了相同的结果。 如果将" & [SDATE] & "" & [EDATE] & " 替换为"MM-DD-YY" 格式的硬编码值,查询是否返回任何内容? 我也想知道为什么你把这个放在里面:getSQLString = SQLstring,它什么也没做。有点偏题了。 硬编码日期也不会返回任何结果。一般来说,我的“where”语句必须有一些愚蠢的东西...... getSQLString = SQLstring ....在我的代码中更高,我调用“getSQLstring”,它进入我的函数并最终进入SQL语句。它允许我对连接和格式化使用相同的代码,我只需要担心为不同的应用程序更改函数的片段。如果您认为有帮助,我可以发布整个代码。 已更新,我没有仔细查看您的查询。当您使用查询构建器时,MS 喜欢添加一堆括号,这会使您看起来很混乱。因为这个原因,我养成了消除它们的习惯。【参考方案2】:

可能您所在的地区将日期作为日期优先而不是月份优先。因此,无论输入什么日期范围,根据该部分不存在任何数据,因为您没有收到任何错误。

因此,考虑两个调整:

    删除任何格式并让用户在他们所在的任何区域输入日期,并根据其 CPU 的默认设置调整日期。

    使用 MS Access'QueryDefs 的参数化,而不是 VBA 中的 SQL 连接,如下所示,使用 DAO 连接。

Sub RunQuery()
    Dim SDATE As Date, EDATE As Date
    Dim SQLstring As String
    Dim conn As Object, db As Object, qdef As Object

    SDATE = Application.InputBox("Beginning Date", "Date 1", Date - 31)   ' REMOVE Format()
    EDATE = Application.InputBox("Ending Date", "Date 2", Date)           ' REMOVE Format()

    Set conn = CreateObject("DAO.DBEngine.120")
    Set db = conn.OpenDatabase("C:\Path\To\Database.accdb")

    ' PREPARED STATEMENT (NO DATA) - CAN BE SAVED IN MS ACCESS AS QUERY OBJECT
    SQLstring = "PARAMETERS [Prm_SDATE] Date, [Prm_EDATE] Date;" & _
                "SELECT i.HistDate, s.MasterPNo, s.ItemDescription," & _
                "       i.HistType, i.HistText, i.HistQty " & _
                "FROM tblitemhistory i " & _
                "INNER JOIN tblstockitems s ON i.StockID = s.ItemID" & _
                "WHERE i.HistDate BETWEEN [Prm_SDATE] AND [Prm_EDATE];"

    ' BIND PARAMETERS
    Set qdef = db.CreateQueryDef("", SQLstring)
    qdef![Prm_SDATE] = SDATE
    qdef![Prm_EDATE] = EDATE

    ' OPEN RECORDSET
    Set rst = qdef.OpenRecordset

    ' DUMP OUTPUT TO EXCEL SHEET
    Worksheets("Sheet1").Range("A1").CopyFromRecordset rst

    rst.Close: db.Close        
    Set qdef = Nothing: Set db = Nothing: Set conn = Nothing
End Sub

【讨论】:

哇 Parfait,你比我的工资等级高! :-) 我不太明白。如果我要发布我的整个代码,您愿意对其进行调整吗? 这个想法是你调整它以获得最终的解决方案。本质上,它查询将数据值绑定到参数的 Access 数据库,并将结果转储到工作表中。我在代码中有 cmets 可以提供帮助。

以上是关于为啥我的 where 语句没有返回结果?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 eloquent orm 上的查询语句结果返回空值

为啥我的查询没有返回任何结果?

执行从 UDF 返回的语句时出现问题 - 没有结果集

为啥我的 bigquery sql 没有返回任何结果?

WHERE DATE_COLUMN = '9999-12-31' 语句导致查询不返回任何结果

为啥我的带有命名参数的查询返回空白结果?