我希望我提出一个理由而不是一个解决办法,如此轻微地违反了规则,这是可以原谅的。
我有以下代码:
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
是多余的,但是应该不会造成伤害(至少在我头上这样)。另外,据我所知DateAdd
与Year
不同,Year-Month
不会将输入字段转换为字符串,它应该保持日期类型。那么这是怎么回事?
编辑:
2017-11
描述了记录发生的月份,看起来像这样:apply
。它是varchar类型,目标是将其作为dd / mm / yyyy格式的正确datetime字段,其中每个月由该月的第一天表示。所以可能是01/05/2018等。
答案 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是多余的。