Access SQL日期条件失效:日期格式识别错误问题咨询
解决日期格式识别错误的问题
这问题我之前踩过坑!用#包裹日期的写法(常见于Access等数据库)很容易受系统区域设置影响,你遇到的就是典型的区域格式不匹配——系统默认按美国格式mm/dd/yyyy解析,而你用的是欧盟的dd/mm/yyyy,导致日期判断完全错位。
给你几个靠谱的解决办法,按优先级排序:
1. 使用ISO标准日期格式(最推荐)
不管系统区域怎么设置,数据库对yyyy-mm-dd这种ISO格式的日期识别都是统一的。把你的SQL改成这样:
SELECT CodOpe, PV_Sensy, Cashflow_Date FROM Amort_Plans_Calc WHERE Cashflow_Date > #2018-04-01# AND Cashflow_Date < #2018-xx-xx#;
这样2018-04-01会被明确识别为2018年4月1日,完全不会有歧义。
2. 使用日期构造函数(无歧义)
如果数据库支持(比如Access的DateSerial),直接通过年、月、日的数值构造日期,彻底规避格式问题:
SELECT CodOpe, PV_Sensy, Cashflow_Date FROM Amort_Plans_Calc WHERE Cashflow_Date > DateSerial(2018, 4, 1) AND Cashflow_Date < DateSerial(2018, xx, xx);
DateSerial(年, 月, 日)会直接生成正确的日期对象,不管任何区域设置都不会出错。
3. 显式转换日期字符串
如果你必须保留dd/mm/yyyy的输入格式,可以用数据库的日期转换函数明确指定解析格式。比如在Access中用CDate配合格式说明:
SELECT CodOpe, PV_Sensy, Cashflow_Date FROM Amort_Plans_Calc WHERE Cashflow_Date > CDate(Format("01/04/2018", "dd/mm/yyyy")) AND Cashflow_Date < ...;
不过这个方法依赖数据库的函数支持,通用性不如前两种。
为什么原来的写法会出错?
当你用#01/04/2018#这种写法时,数据库会读取当前系统的区域设置来解析日期。如果系统是美国区域(或者数据库连接的区域是美国),就会把01当成月份,04当成日期,也就是2018年1月4日,和你预期的4月1日完全相反,自然查不到正确的记录。
内容的提问来源于stack exchange,提问作者Joe
相关产品推荐
相关产品推荐

