访问查询中的数据类型不匹配

时间:2011-08-26 18:52:53

标签: sql database ms-access vba sqldatatypes

所以我有一个查询,假设从两个表中获取数据。只要日期格式在english(us)语言环境下,它就可以正常工作。当它处于国际格式化时,查询在运行时会出错并失败。查询是

        SELECT DISTINCT AlarmDet.Machine, AlarmDet.Job, 
AlarmDet.Mode, AlarmDet.User, AlarmDet.JobStart,
 AlarmDet.Object, AlarmDet.AlarmId, AlarmDet.AlarmStart, 
AlarmDet.MachineFault, AlarmDet.OperFault,
     AlarmDet.PiecesFed, Val(OperFault)+Val(MachineFault) AS AlarmStopTime, 
    (Mid(alarmdet.AlarmStart,5,7) & Right(alarmdet.AlarmStart,4) & Mid(alarmdet.AlarmStart,11,9)) AS AlarmTimeDate, 
    Mid(alarmdet.AlarmStart,12,2) AS AlarmHH, 
    Mid(alarmdet.AlarmStart,15,2) AS AlarmMM,
 Mid(alarmdet.AlarmStart,18,2) AS AlarmSS, 
CVDate((Mid([alarmdet].[AlarmStart],5,7) & Right([alarmdet].[AlarmStart],4))) AS AlarmDate, Alarms.ALARM_DESC
    FROM AlarmDet INNER JOIN Alarms ON AlarmDet.AlarmId = Alarms.id;

查询中的公式正在执行警报启动(日期)并将其拆分为单独的段。

当我进入并尝试运行它时导致错误的查询部分是:

CVDate((Mid([alarmdet].[AlarmStart],5,7) & Right([alarmdet].[AlarmStart],4))) AS AlarmDate

我想知道的是,如果有一种方法可以将查询的格式转换为美国日期格式转换? 或者是否有更好的方法来构建查询的这一部分,以使其在国际格式下运行?

更新

花了一些时间并尝试了一些建议后,我想出了这个:

format(Mid([alarmdet].[AlarmStart],5,7) & right([alarmdet]![alarmstart], 4), "mm/dd/yyyy")

然而,我没有得到mm / dd / yyyy,而是得到了这个: MM-DD-YYYY。

为什么会这样想?

再次更新:

没关系,看起来,这与你的语言环境设置的位置有关。

非常感谢任何建议或帮助。

感谢。

2 个答案:

答案 0 :(得分:1)

尝试在日期字段上使用ACCESS的Year()和Month()函数,而不是MID和Right函数来解析日期...我没有安装ACCESS,但它会是这样的:

CVDate(Str(month([alarmdet].[AlarmStart]))&
     "/"&str(year([alarmdet].[AlarmStart]))) AS AlarmDate

您可能需要稍微调整一下,但这些功能应该正确提取日期信息......

答案 1 :(得分:1)

查看Format()函数是否允许您根据需要显示[AlarmStart]。以下是从立即窗口复制的一些示例表达式。

? Format(Date(), "yyyy/mm/dd")
2011/08/29

? Format(Date(), "mmm d, yyyy h:nn:ss ampm")
Aug 29, 2011 12:00:00 AM

编辑:这是我使用您为[AlarmStart]提供的示例文本值(“Tue Jan 18 10:10:57 2011”)在立即窗口中获得的内容。

? Format(Mid("Tue Jan 18 10:10:57 2011", 5, 7) & _
    Right("Tue Jan 18 10:10:57 2011", 4), "mm/dd/yyyy")
01/18/2011