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

时间:2015-07-27 20:45:42

标签: ms-access time report

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

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

AND

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

= [EndTimeOff] - [BeginTimeOff]

我无法得到任何工作。我可以减去日期,但不是时候。救命!

1 个答案:

答案 0 :(得分: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)列:

AccessTable.png

如果要直接使用链接表中的列,则必须将值转换为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

LinkedView.png