具有多个 date1 和单个 date2 参数的 MS Access Datediff
MS Access Datediff with more than one date1 and single date2 argument
假设如下:
(忽略 "create table" 段中的错误 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=[查询以获取 Event1 参与者的特定到达时间]
date2=[查询以获取 Event1 的特定 Start_Time]
(您可能已经注意到,date2 是单数)
我想运行更新查询并根据多种条件更改一些数据,其中我只卡在以下
where DateDiff("n",date1,date2)<0
(这个特殊条件应该检查是否有人迟到).
我遇到的问题是,如何为所有参与者做到 date/time 分钟差异?
当 date1 是单行时,我可以让它工作,但在多行时,它说 "can fetch maximum one row" 或类似的东西。
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
这是我最终拼凑在一起的 VBA 代码,使访问像任何 sql 标准方言一样工作。
虽然我承认@Wolfgang Kais 的回答
我通过 VBA 解决了我的问题,如果有任何建议,如何使它更优雅,我将不胜感激。我觉得可以改进此代码以使其看起来更好,但现在不知道如何。
假设如下:
(忽略 "create table" 段中的错误 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=[查询以获取 Event1 参与者的特定到达时间]
date2=[查询以获取 Event1 的特定 Start_Time] (您可能已经注意到,date2 是单数)
我想运行更新查询并根据多种条件更改一些数据,其中我只卡在以下
where DateDiff("n",date1,date2)<0
(这个特殊条件应该检查是否有人迟到).
我遇到的问题是,如何为所有参与者做到 date/time 分钟差异?
当 date1 是单行时,我可以让它工作,但在多行时,它说 "can fetch maximum one row" 或类似的东西。
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
这是我最终拼凑在一起的 VBA 代码,使访问像任何 sql 标准方言一样工作。 虽然我承认@Wolfgang Kais 的回答 我通过 VBA 解决了我的问题,如果有任何建议,如何使它更优雅,我将不胜感激。我觉得可以改进此代码以使其看起来更好,但现在不知道如何。