假设以下内容:
(忽略“创建表”段中错误的sql语法,为简化理解,我正在简化消息)
Create table Event_Participants (
Event_Name, text
Event_Participant, text
Event_Participant_Arrival, date/time
Event_Participant_Leaving date/time
)
没有PK,只有Event_Name和Event_Participant上的索引可以确保一个事件不能多次记录任何参与者。
同时假设
Create table Events (
Event_Name, text
Event_Start_Time, date/time
Event_End_Time, date/time
)
同样,没有PK:只有Event_Name是唯一索引
date1 = [查询以获取参与者特定事件1的到达时间]
date2 = [查询以获取Event1的特定Start_Time] (您可能已经注意到,date2是单数)
我想基于多个条件运行一个更新查询并使用它来更改一些数据,其中我只停留在以下条件上
where DateDiff("n",date1,date2)<0
(此特殊条件应检查是否有人迟到了)。
我要坚持的是,如何对所有参与者进行以分钟为单位的日期/时间差异?
当date1是单行时,我可以使它工作,但在多行上,它说“可以获取最大一行”或类似的东西。
答案 0 :(得分:0)
Dim rs As DAO.Recordset
Dim qry, points, pp As String
Dim pts As Integer
pp = Me.Form.cbo_query_picker.Value
Set rs = CurrentDb.OpenRecordset("SELECT DateDiff('n',IIf([Arrival Date]<=(SELECT Start_Date FROM Events WHERE Descriptive_Name='" & pp & "'),(SELECT Start_Date FROM Events WHERE Descriptive_Name='" & pp & "'),[Arrival Date]),IIf([Quitting Date]>=(SELECT End_Date FROM Events WHERE Descriptive_Name='" & pp & "'),(SELECT End_Date FROM Events WHERE Descriptive_Name='" & pp & "'),[Quitting Date])) AS pts, Event_Participants.Participant, Event_Participants.[Event Name] FROM Event_Participants")
rs.MoveFirst
Do Until rs.EOF = True
pts = Int(rs("pts").Value / 30) * 3
qry = "update customers set points = points + "
qry = qry & Format(pts, "0")
qry = qry & " where [Customer name] = '"
qry = qry & rs("Participant") & "'"
CurrentDb.Execute (qry)
Debug.Print qry
rs.MoveNext
Loop
rs.Close
这是我最终加在一起使访问工作像任何sql标准方言一样的VBA代码。 虽然我承认@Wolfgang Kais的回答 相反,我通过VBA解决了我的问题,并且希望您提出任何建议,以使它变得更加优雅。我认为可以将这些代码进行改进以使其看起来更好,但目前还不知道如何。