Sql access查询中的数据类型不匹配

Sql access查询中的数据类型不匹配,sql,database,ms-access,vba,sqldatatypes,Sql,Database,Ms Access,Vba,Sqldatatypes,所以我有一个查询,假设它从两个表中获取数据。只要日期格式在英语(美国)语言环境下,它就可以正常工作。当查询处于国际格式时,查询在运行时会出错并失败。问题是 SELECT DISTINCT AlarmDet.Machine, AlarmDet.Job, AlarmDet.Mode, AlarmDet.User, AlarmDet.JobStart, AlarmDet.Object, AlarmDet.AlarmId, AlarmDet.AlarmStart, AlarmDet

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

        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;
查询中的公式所做的是获取alarmstart(日期)并将其拆分为单独的段

当我进入并尝试运行查询时,导致错误的查询部分如下所示:

CVDate((Mid([alarmdet].[AlarmStart],5,7) & Right([alarmdet].[AlarmStart],4))) AS AlarmDate
我想知道的是,access中是否有方法将要提交的查询的格式转换为我们的DateFormatting? 或者是否有更好的方法来构造查询的这一部分,以使其在国际格式下运行

更新

在花了一些时间尝试了你的一些建议后,我得出了以下结论:

format(Mid([alarmdet].[AlarmStart],5,7) & right([alarmdet]![alarmstart], 4), "mm/dd/yyyy")
但是,我得到的不是mm/dd/yyyy,而是: 年月日

你有没有想过为什么会这样

更新:再次…

不管怎样,这似乎与您的语言环境设置的位置有关

非常感谢您的任何建议或帮助

谢谢。

尝试在日期字段中使用ACCESS的Year()和Month()函数,而不是MID和Right函数来解析日期。。。我没有安装ACCESS,但它可能类似于:

CVDate(Str(month([alarmdet].[AlarmStart]))&
     "/"&str(year([alarmdet].[AlarmStart]))) AS AlarmDate
您可能需要对其进行一些调整,但这些函数应该正确提取日期信息

查看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

DateSerial()不是这个问题的常用解决方案吗?您所需要做的就是以明确的字符串格式传递日期条件,例如,mmm dd yyy。它不一定是美国的日期格式,只是一种不能以多种方式解释的格式(这意味着月份必须拼写出来,而不是数字)。所以我设置了如下格式
?格式(Mid([alarmdet].[AlarmStart],5,7)和right([alarmdet]![AlarmStart],4),“mm/dd/yyyy”)
尽管如此,我还是在2011年1月18日收到了这封信。有什么想法吗?@James213为我们展示了[AlarmStart]的示例值,以及您希望该值如何显示。另外,[AlarmStart]的数据类型是文本还是日期/时间?
2011年1月18日星期二10:10:57
是我从[AlarmStart]得到的一个示例,我需要取出的是2001年1月18日的数据,并且它看起来像
2011年1月18日
,当前的格式设置为“mm/dd/yyyy”我得到了这个
01-18-2011
,它是一个文本数据类型。在我的系统上,我得到了我认为您需要的东西。我不明白为什么它在你的系统上工作方式不同。