访问报告 - 计算 2 次之间的小时数

Access Report - Calculating Hours between 2 times

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

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

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

= [EndTimeOff] - [BeginTimeOff]

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

Access 没有时间字段类型(Access Date/Time 字段同时具有日期和时间部分),以及 ODBC linked [=50= 中的任何未知字段类型] 通常映射到 Text。所以如果你有一个 SQL 服务器 table 有 time(7) 列 ...

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

然后 Access 中相应的 ODBC linked table 将有 Text(255) 列:

如果您想直接使用 linked table 中的列,那么您必须先将这些值转换为 Access 可以接受的形式,然后才能使用 [=18 之类的函数=] 与他们一起做计算。具体来说,Access Date/Time 值不支持小数秒,因此您必须删除它们。也就是说,

CDate("07:59:00.0000000")

将失败并出现 "Type mismatch" 错误(运行-时间错误 13),而

CDate("07:59:00")

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

另一种方法是创建一个 SQL 服务器视图,将 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

然后如果您 link 到该视图,列将在 Access

中显示为 Date/Time