Access交流中心

北京 | 上海 | 天津 | 重庆 | 广州 | 深圳 | 珠海 | 汕头 | 佛山 | 中山 | 东莞 | 南京 | 苏州 | 无锡 | 常州 | 南通 | 扬州 | 徐州 | 杭州 | 温州 | 宁波 | 台州 | 福州 | 厦门 | 泉州 | 龙岩 | 合肥 | 芜湖 | 成都 | 遂宁 | 长沙 | 株洲 | 湘潭 | 武汉 | 南昌 | 济南 | 青岛 | 烟台 | 潍坊 | 淄博 | 济宁 | 太原 | 郑州 | 石家庄 | 保定 | 唐山 | 西安 | 大连 | 沈阳 | 长春 | 昆明 | 兰州 | 哈尔滨 | 佳木斯 | 南宁 | 桂林 | 海口 | 贵阳 | 西宁 | 乌鲁木齐 | 包头 |

求思路:如何查询某一时间点有几个员工在岗?

Huang  发表于:2021-01-09 16:37:15  
复制

假设上班时间:

张三丰:8:00-16:00

张无忌:8:00-12:00,14:00-18:00

张敏:15:30-00:00

请问,如何查询在15:30-16:00之间有3个员工?

请求思路,感谢!

 

Top
vious 发表于:2021-01-11 08:33:56

是指在15:30-16:00都在,还是只要是在这个段内都行?比如有人15:45离开算不算在内?

有没有跨天的情况?

如果不算的话,先拆解原始数据,生成新表,再在新表内查询;如果算的话,就得看详细的要求了,或者比较的特别详细,也很麻烦



西出阳关无故人 发表于:2021-01-11 14:05:27

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));





总记录:2篇  页次:1/1 9 1 :