1,首先把表转化成这样的表(新表):姓名,开始时间(日期时间类型),结束时间(日期时间类型)
然后查询:select count(*) from 新表 where 开始时间<=#2020-01-11 1:30:00# and 结束时间>=#2020-1-11 16:00:00#
2,创建自定义函数判定是否在班,条件是工作时间的格式要固定:
标点符号固定
第一个冒号前是姓名,
时间段之间的"-"要统一,表示时间只能用数字+冒号,时间段的开始时间要小于结束时间,跨凌晨的要另外处理.
多个时间段之间只能用逗号分隔.
再用自定义函数配合进行查询.
参考
Public Function isWork(sb As String, A As Date, Z As Date) As Boolean
Dim i
Dim sbFormat
Dim N '姓名和时间段之间的分隔标记(冒号)的位置
Dim M '开始时间和结束时间之间的标记(减号)的位置
sbFormat = Replace(sb, ":", ":")
sbFormat = Replace(sbFormat, ",", ",")
sbFormat = Replace(sbFormat, "~", "-")
N = InStr(1, sbFormat, ":")
Dim WT '工作时间段
WT = Mid(sbFormat, N + 1)
Dim STA As Date '开始时间
Dim STZ As Date '结束时间
' Debug.Print "WT", WT
Dim arr
arr = Split(WT, ",")
For i = 0 To UBound(arr)
M = InStr(1, arr(i), "-")
STA = CDate(Trim(Mid(arr(i), 1, M - 1)))
' Debug.Print Mid(arr(i), M + 1)
STZ = CDate(Trim(Mid(arr(i), M + 1)))
' Debug.Print "开始和结束", STA, STZ
If A >= STA And Z <= STZ Then
isWork = True
Exit Function
End If
Next i
isWork = False
End Function
查询:
SELECT Count(上班.上班时间) AS 上班人数
FROM 上班
WHERE (((isWork([上班时间],#12/30/1899 15:30:0#,#12/30/1899 16:0:0#))=True));