【问题标题】:Compare date range with dates in table VBA将日期范围与表 VBA 中的日期进行比较
【发布时间】:2012-05-02 14:02:47
【问题描述】:

我使用 MS Access 作为 MySQL 服务器数据库的前端。在数据库中,我有一个名为 PubHol(意为公共假期)的表格,列出了公共假期的日期 dd/mm/yyyy。我有一个表格(链接到一个单独的表格),我在其中输入 course_start 日期和 course_end 日期。我想创建一个函数,该函数在一个字段的 lostfocus 上触发,该函数检查输入 course_start 和 course_end 的日期范围是否与 PubHol 中列出的日期一致。例如,如果客户的课程开始时间为 2012 年 1 月 1 日,课程结束时间为 2012 年 1 月 1 日,并且 PubHol 中有一个日期介于 2012 年 10 月 1 日之间,我想收到一个 MsgBox 说些什么。谢谢

【问题讨论】:

  • 您的意思是将日期存储为字符串吗?如果是这样,为什么不使用更合适的字段将它们存储为日期
  • 嗨。我将公共假期的日期作为日期存储在表格中。 course_start 和 course_end 日期位于另一个表 (Main_Data_Table) 中,该表基本上是预订表格。我需要的是,当员工输入新预订并输入 course_start 和 Course_end 时,这与 PubHol 表中的一个日期一致,他们会收到一条消息,说 bla bla bla ... 谢谢
  • 对,所以当你给出“dd/mm/yyyy”部分时,这完全无关紧要,对吧?这不像是文本格式实际上它们是如何存储的?
  • @elstiv:不客气。另外,由于您是 StackOverflow 的新手,我想通知您,您可以通过勾选答案旁边的勾号来为好的答案投票并接受对您帮助最大的答案。在本网站上,点赞或接受的答案都算作“感谢”。

标签: mysql ms-access vba date


【解决方案1】:

听起来您只想向 MySQL 发出 BETWEEN 查询:

SELECT HolidayDate FROM PubHol
WHERE HolidayDate BETWEEN ? AND ?

...并使用您感兴趣的Course_StartCourse_End 值填写查询参数。(我假设VBA 可以处理参数化查询。)

【讨论】:

    【解决方案2】:

    假设您在数据库中使用日期数据类型而不是字符串数据类型,则在 VBA 中测试日期范围内的假期将如下所示

    Dim condition As String
    Dim course_start As Date, course_end As Date
    
    course_start = ...
    course_end = ...
    condition = "[Holiday] Between #" & Format$(course_start,"yyyy\/mm\/dd") & _
                "# AND #" & Format$(course_end,"yyyy\/mm\/dd") & "#"
    If DCount("*", "PubHol", condition) > 0 Then
        MsgBox ...
    End If
    

    我在我的 Access 库中找到了这个函数

    Public Function JetSqlDate(ByVal d As Variant) As String
        If IsNull(d) Then
            JetSqlDate = "NULL"
        Else
            JetSqlDate = Format$(d, "\#mm\/dd\/yyyy hh\:nn\:ss\#")
        End If
    End Function
    

    使用它可以简化条件

    condition = "[Holiday] Between " & JetSqlDate(course_start) & _
                " AND " & JetSqlDate(course_end) 
    

    注意:如果 MySQL 表通过 ODBC 链接到 Access DB,您可以只使用 Access (Jet) SQL 语法。 Access(或者更准确地说是 ODBC-Driver)会自动将其转换为 MySQL 语法。

    【讨论】:

    • 非常感谢,明天早上试用并恢复。再次感谢
    • 如果平台支持使用类型化值和参数化 SQL,我强烈建议同时使用这两者,而不是依赖字符串格式并包含数据在 SQL 中。
    • @JonSkeet:我同意参数化查询通常更好;但是,在这里我使用的值键入为Date,并且我们有一个桌面场景。所以 SQL 注入应该不是问题。此外,我想使用方便的内置DCount 函数。我想知道,是否可以通过DCount 和 ODBC 进行 SQL 注入?
    猜你喜欢
    • 2017-12-31
    • 1970-01-01
    • 1970-01-01
    • 2017-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多