DateDiff访问查询返回#Error

时间:2014-10-09 14:14:38

标签: sql ms-access ms-access-2007

我想获得两个日期之间的天数。 这是我在Access Query Designer中使用的表达式。 (Access 2007)

Expr1: DateDiff('d',[Accept Date],[Sent Date])

查询返回#Error。

[接受日期]和[发送日期]格式为yyyymmdd,数据类型为TEXT。 我将其更改为日期/时间,但Access清除了数据。

如果有帮助,这是查询背后的SQL:

SELECT RTG.[PRO NO], RTG.[Service], RTG.[Sent Date], RTG.[Accept Date], DateDiff('d',[Accept Date],[Sent Date]) AS Expr1
FROM RTG
WHERE (((RTG.[PRO NO Prefix])<>"215") AND ((RTG.[Invoice Number])="8548"));

这必须简单,对吧?

1 个答案:

答案 0 :(得分:3)

DatePart可以接受实际为text而不是Date / Time数据类型的日期。但是,文本必须是Access识别为有效日期表示的内容。 “yyyymmdd”格式的文本日期不符合该要求。例如,在立即窗口中......

? IsDate("20141009")
False

但是,如果在年,月和日段之间插入短划线,Access可以将文本字符串识别为日期。

? Format("20141009", "0000-00-00")
2014-10-09
? IsDate(Format("20141009", "0000-00-00"))
True

在简单查询中测试该技术,以确保它避免错误。

SELECT
    RTG.[Sent Date],
    RTG.[Accept Date],
    DateDiff(
        'd',
        Format([Accept Date],'0000-00-00'),
        Format([Sent Date],'0000-00-00')
    ) AS Expr1
FROM RTG

如果Access仍然抛出错误,请使用CDate将文本日期强制转换为日期/时间数据类型。

    DateDiff(
        'd',
        CDate(Format([Accept Date],'0000-00-00')),
        CDate(Format([Sent Date],'0000-00-00'))
    ) AS Expr1

使用实际的日期/时间字段,您的任务将不那么具有挑战性。您可以创建新的日期/时间字段并执行UPDATE查询以从旧文本日期字段加载转换后的值。