为何paymentDate为11-4-18时,paymentDate < #12-4-18#判断结果为false?
问题原因分析及解决方案
这是个典型的日期格式歧义导致的问题,核心在于数据库对短日期格式的解析依赖于系统/数据库的区域设置,导致你预期的日期顺序和实际解析的顺序不一致。
核心原因:日期解析顺序不匹配
在使用#日期#格式(常见于Access等数据库)时,数据库会根据区域设置来解析日期的日、月、年顺序,常见的两种解析规则是:
- MM-DD-YY(月-日-年):比如
#12-4-18#会被解析为2018年12月4日 - DD-MM-YY(日-月-年):比如
#12-4-18#会被解析为2018年4月12日
你遇到的paymentDate < #12-4-18#返回false,最可能的场景是:
- 你的
paymentDate值11-4-18被解析为2018年11月4日(按照MM-DD-YY规则) - 而
#12-4-18#被数据库按照DD-MM-YY规则解析为2018年4月12日 - 此时2018年11月4日显然晚于2018年4月12日,所以比较结果为
false
其他可能的次要原因
- 两位年份的解析规则差异:部分数据库对两位年份的默认解析范围不同(比如把
18解析为1918而非2018),如果paymentDate的11-4-18被解析为2011年4月18日,而#12-4-18#被解析为1918年12月4日,也会出现前者大于后者的情况,但这种场景相对少见。 - 字段类型错误:如果
paymentDate是字符串类型而非日期类型,数据库会按字符串字典序比较,但"11-4-18"字典序小于"12-4-18",所以这种情况不太可能导致结果为false,但还是建议确认字段类型。
解决方案
- 使用无歧义的日期格式:永远优先使用
YYYY-MM-DD格式的日期,比如把查询改为:
这种格式是SQL标准格式,所有数据库都会按年-月-日的顺序解析,完全避免歧义。SELECT sum(paidAmount) AS payAmount FROM Payment where paymentDate < #2018-12-04#; - 统一日期解析规则:检查数据库或服务器的区域设置,确保日期解析顺序和你存储
paymentDate时的规则一致。 - 确认字段类型:保证
paymentDate字段是日期/时间类型(而非字符串),避免字符串比较带来的意外结果。
内容的提问来源于stack exchange,提问作者Maqsood Ahmad
相关产品推荐
相关产品推荐

