CDate使DateAdd公式失败

时间:2018-07-23 13:49:41

标签: sql ms-access

我希望我提出一个理由而不是一个解决办法,如此轻微地违反了规则,这是可以原谅的。

我有以下代码:

INSERT INTO destinationTable (RecordMonth, ...)
SELECT t1.Expr1, ...
FROM
    (   
    SELECT 
        CDate(Format("01-" & Right([t1].[Year-Month],2) & "-" & Left([t1].[Year-Month],4),"dd/mm/yyyy")) AS Expr1, 
        /* ...other fields with no bearing... */
    FROM tcsvMonthData AS t1
    )
WHERE t1.Expr1 >= DateAdd("m",-6,(SELECT MAX(Expr1) FROM t1))
[Year-Month]中的

t1是varchar类型的字段。

此脚本失败,Access给出以下错误消息:“条件表达式中的数据类型不匹配。”

如果我删除CDate块,脚本将起作用。很高兴找到答案,但是我不明白为什么错误会首先出现。 CDate将字段限制为日期类型。在format之后,该字段应该已经是一个日期类型,因此CDate是多余的,但是应该不会造成伤害(至少在我头上这样)。另外,据我所知DateAddYear不同,Year-Month不会将输入字段转换为字符串,它应该保持日期类型。那么这是怎么回事?

编辑: 2017-11描述了记录发生的月份,看起来像这样:apply。它是varchar类型,目标是将其作为dd / mm / yyyy格式的正确datetime字段,其中每个月由该月的第一天表示。所以可能是01/05/2018等。

3 个答案:

答案 0 :(得分:2)

您正在使此过程变得过于复杂。 CDate 是您所需要的:

CDate([t1].[Year-Month]) AS Expr1

编辑:

要接受 Null 值,请过滤掉这些值,或使用 CVDate Null 传递给:

CVDate([t1].[Year-Month]) AS Expr1

或使用 Nz 提供默认值:

Nz(CVDate([t1].[Year-Month]), Date()) AS Expr1

答案 1 :(得分:0)

我在sql server中找到了解决方案,请使用cdate代替强制类型转换进行ms访问。

 select  cast(format(cast('01-' + left('07/23/2018',2) + '-' + right('07/23/2018',4) as date),'dd/MM/yyyy') as date) AS Expr1

使用您的列更改静态日期。

答案 2 :(得分:0)

已经有很长时间了,我不得不使用Access,但是我认为问题不在于您使用CDate()而是内部字符串上使用Format()。 Format()需要对日期进行操作,但是您给它一个字符串。由于Format失败,因此周围的CDate()也失败了。

您需要像这样在Format()之前使用CDate():

        Format(CDate ("01-" & Right([t1].[Year-Month],2) & "-" & Left([t1].[Year-Month],4),"dd/mm/yyyy")) AS Expr1, 

您可能需要做一些调整才能使它运行,但是基本思路应该起作用。

以下被拒绝的答案之所以有效,是因为在Format()之前和之后都使用了Cast As Date(在功能上等同于CDate),因此Format()被传递了Date。在该示例中,第二次Cast是多余的。