【问题标题】:Access Report - Calculating Hours between 2 times访问报告 - 计算 2 次之间的小时数
【发布时间】:2015-07-27 20:45:41
【问题描述】:

我有一个带有 Access 前端的 SQL 休假数据库。我目前在报告中有 BeginTimeOff 和 EndTimeOff 字段。在我的 SQL 数据库中,这些是 Time(7) 字段。我想要一个新字段来显示时差。我试图让控制源等于:

=DateDiff("n",CDate([BeginTimeOff]),CDate([EndTimeOff])) 

=DateDiff("n",[BeginTimeOff],[EndTimeOff]) 

= [EndTimeOff] - [BeginTimeOff]

我什么都做不了。我可以很好地减去日期,而不是时间。帮助!

【问题讨论】:

    标签: ms-access time report


    【解决方案1】:

    Access 没有仅限时间的字段类型(Access Date/Time 字段同时具有日期和时间组件),并且 ODBC 链接表中的任何未知字段类型通常映射到 Text。因此,如果您有一个带有 time(7) 列的 SQL Server 表...

    CREATE TABLE [dbo].[TimeTest](
        [Id] [int] NOT NULL,
        [BeginTimeOff] [time](7) NULL,
        [EndTimeOff] [time](7) NULL
        ...
    

    那么Access中对应的ODBC链接表将有Text(255)列代替:

    如果您想直接使用链接表中的列,则必须先将值转换为 Access 将接受的形式,然后才能使用 DateDiff() 等函数对其进行计算。具体来说,访问日期/时间值不支持小数秒,因此您必须删除它们。也就是说,

    CDate("07:59:00.0000000")
    

    将失败并出现“类型不匹配”错误(运行时错误 13),而

    CDate("07:59:00")
    

    工作正常。您可以使用InStr()Left()Mid() 等字符串操作函数来去除字符串的小数部分。

    另一种方法是创建一个 SQL Server 视图,将 DATE(7) 列转换为 DATETIME

    CREATE VIEW [dbo].[TimeView]
    AS
    SELECT
        Id, 
        DATEADD(day, -2, CONVERT(DATETIME, BeginTimeOff)) AS BeginTimeOff, 
        DATEADD(day, -2, CONVERT(DATETIME, EndTimeOff)) AS EndTimeOff
    FROM dbo.TimeTest
    

    然后,如果您链​​接到该视图,列将在 Access 中显示为 Date/Time

    【讨论】:

    • 但是=DateDiff("n",CDate([BeginTimeOff]),CDate([EndTimeOff])) 不应该失败。我们需要更多信息。
    • 好的。那么=DateDiff("n",CDate(Left([BeginTimeOff],8)),CDate(Left([EndTimeOff],8))) 应该可以工作了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多