2012-05-02 111 views
0

我正在使用MS Access作为MySQL服务器数据库的前端。在数据库中,我有一个名为PubHol(意思是公共假期)的表格,列出公共假期的日期dd/mm/yyyy。我有一个表格(链接到一个单独的表格),我输入course_start日期和course_end日期。我想创建一个函数,在函数检查日期范围输入course_start和course_end是否与PubHol中列出的日期一致的字段的lostfocus上触发自己。例如,如果客户的课程开始时间为01/01/2012,课程结束时间为15/01/2012,并且PubHol中的日期为前10/01/2012之间时,我希望收到一个MsgBox说某事。谢谢比较日期范围与表中的日期VBA

+0

你的意思是你将日期存储为* strings *?如果是这样,为什么不使用更合适的字段将它们存储为*日期*? –

+0

嗨。我将公共假期的日期作为日期存储在表格中。 course_start和course_end日期位于另一个表格(Main_Data_Table)中,该表格基本上是预订表格。我需要的是,当员工进入一个新的预订,他们输入course_start和Course_end与PubHol表中的一个日期相符合时,他们收到一条消息说bla bla bla ...谢谢 – elstiv

+0

对,所以当你给“dd/mm/yyyy“部分,这完全不相干,对吗?它不像文本格式实际上*它们是如何存储的? –

回答

0

这听起来像你只是想发出一个BETWEEN查询到MySQL:

SELECT HolidayDate FROM PubHol 
WHERE HolidayDate BETWEEN ? AND ? 

...并在与Course_StartCourse_End值你感兴趣的查询参数填写。 (我假定VBA可以处理参数化查询。)

+0

非常感谢 - 我会尝试它并恢复... – elstiv

0

假设你在你的数据库使用的日期数据类型而不是字符串数据类型,测试其陷入日期范围的假期应该是这样的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 

我在访问库

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表链接到Access数据库使用ODBC,您可以使用Access(Jet)SQL语法。访问(或ODBC驱动程序是精确的)会自动将其转换为MySQL语法。

+0

非常感谢,明天早上将尝试它并恢复。再次感谢 – elstiv

+1

*如果*平台支持使用类型化值和参数化SQL,我强烈推荐使用这两种方法,而不是依赖字符串格式并在SQL中包含数据。 –

+0

@JonSkeet:我同意参数化查询通常更好;然而,在这里我正在使用一个类型为“Date”的值,并且我们有一个桌面场景。所以SQL注入应该不成问题。此外,我想使用方便的内置'DCount'功能。我想知道,如果SQL注入可能通过'DCount'和通过ODBC? –