【问题标题】:approximate Vlookup function in MS Access?MS Access 中的近似 Vlookup 函数?
【发布时间】:2021-10-18 17:56:42
【问题描述】:

在 Access 中,我有一个表格,我可以在其中输入每天开始和完成工作的时间。从逻辑上讲,这两个数字可以让您计算出您工作了多长时间。 在另一个表中,我目前有四条记录,根据我那天工作的时间来定义特定一天的午休时间,类似于这样

最少工作时间;最短休息时间

0:00; 0:00

5:31; 0:15

7:01; 0:30

9:01; 1:00

在 Excel 中,我可以使用 Vlookup,设置为使用近似时间。例如,如果某一天的持续时间是 7:42,则 Vlookup 将返回“0:30”,然后转到最接近的较低值 7:01,然后返回 0:30。 Access的查询窗口中的公式编辑器中是否有解决此问题的功能,还是Access只是缺少这种可能性?我只是对此很好奇。

【问题讨论】:

  • DLOOKUP 可能会为您工作。如果您需要更灵活的东西,请查看consultdmw.com/microsoft-access-vlookup-function.html
  • 这两个字段的数据类型是什么?
  • 数据类型为“日期/时间”。我总是有点担心时间,因为我总是认为,用这种类型分叉比用数字更难。然而,在 Excel 中,我设法建立了这种查找方式。

标签: ms-access lookup approximate


【解决方案1】:

嵌套查询可以返回中断时间:

SELECT tblWork.WorkTime, 
    Format((SELECT Max(MinimumBreak) FROM tblBreaks 
            WHERE MinimumWorkTime<=tblWork.WorkTime), "Short Time") AS BreakTime
FROM tblWork;

SELECT tblWork.WorkTime, 
    Format((SELECT TOP 1 MinimumBreak FROM tblBreaks 
            WHERE MinimumWorkTime<=tblWork.WorkTime 
            ORDER BY MinimumBreak DESC), "Short Time") AS BreakTime
FROM tblWork;

但是,两者都会产生不可编辑的数据集,因此这对于报告来说是可以的,但对于数据输入表单来说是不行的。在文本框中使用域聚合函数表达式。

DMax("MinimumBreak", "tblBreaks", "MinimumWorkTime<=#" & Me.WorkTime & "#")

【讨论】:

    【解决方案2】:

    使用子查询查找休息时间:

    SELECT 
        TableWork.Id, 
        TableWork.BeginTime, 
        TableWork.FinishTime, 
        CDate(FinishTime - BeginTime) AS WorkTime, 
        
        (Select Top 1 
            [Minimum break]
        From
            TableBreak
        Where
            [Minimum work time] <= ([FinishTime] - [BeginTime])
        Order By 
            [Minimum work time] Desc) AS BreakTime, 
    
        CDate([WorkTime] - [BreakTime]) AS NetTime
    FROM 
        TableWork
    ORDER BY 
        TableWork.Id;
    

    【讨论】:

    • 您好 Gustav,感谢您的建议。我非常感谢您的帮助。首先我遇到了一个问题,因为我尝试在代码的嵌套部分中使用“[FinishTime] - [BeginTime]”的别名,这导致 Access 显示一个对话框,要求我手动输入工作时间.但是,现在它可以工作并且可以继续我的私人项目。干杯
    【解决方案3】:

    如果您的表字段数据类型为Date/Time,请尝试以下查询。

    SELECT TOP 1 format(tblST.MinBrk,"hh:mm") as [Minimum Break]
    FROM tblST
    WHERE (((tblST.[MinWT])<=TimeSerial(7,42,0)))
    ORDER BY tblST.MinWT DESC;
    

    如果数据类型是Number,那么试试下面-

    SELECT TOP 1 tblST2.MinBrk as [Minimum Break]
    FROM tblST2
    WHERE (((tblST2.[MinWT])<=7.42))
    ORDER BY tblST2.MinWT DESC;
    

    【讨论】:

    • 嗨,哈伦,感谢您的帮助。我回家后试试。会很酷,如果它工作。我让它在 Excel 中运行,但我很想在 Access 数据库中实现它。
    • 这个返回值将如何形成或查询用户的工作时间来显示休息时间?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-21
    • 2015-05-02
    • 1970-01-01
    • 1970-01-01
    • 2017-01-16
    相关资源
    最近更新 更多