SQL中BETWEEN与>=、<=查询同一表的结果是否存在差异?
BETWEEN vs >=/<= for Date Queries: Are They Different?
嘿,这个问题问到点子上了——很多人在处理日期查询时都会忽略这个细节,尤其是当字段包含时间部分的时候!咱们分两种核心情况来拆解:
1. 当DATE字段是纯日期类型(无时分秒)
如果你的字段是像 MySQL 的DATE、PostgreSQL 的DATE或者 SQL Server 的DATE这类仅存储年月日的类型,那这两个查询的结果完全没有差异。
BETWEEN '01/01/2007' AND '30/9/2007'本质上就是闭区间查询,等价于>= '01/01/2007' AND <= '30/9/2007',都会返回所有日期在2007年1月1日到2007年9月30日之间的记录。
2. 当DATE字段是日期时间类型(包含时分秒)
这就是坑所在了!几乎所有数据库都会把纯日期字符串(比如'01/01/2007')隐式转换为当天的00:00:00时刻。这时候:
BETWEEN '01/01/2007' AND '30/9/2007'等价于>= '2007-01-01 00:00:00' AND <= '2007-09-30 00:00:00'——这会漏掉2007年9月30日当天00:00:01到23:59:59之间的所有记录!- 你的第二个查询
DATE >= '01/01/2007' AND DATE <= '30/9/2007'和上面的BETWEEN结果完全一致,因为同样是把结束边界限定在了9月30日的零点。
正确的写法(针对日期时间字段)
如果想包含9月30日当天的所有时间点,别用BETWEEN或者<= '30/9/2007',应该写成:
SELECT * FROM table WHERE DATE >= '01/01/2007' AND DATE < '01/10/2007'
这样就能覆盖2007年9月30日23:59:59之前的所有记录,不会遗漏任何数据。
额外提醒
尽量用ISO标准日期格式('2007-01-01')替代'01/01/2007',避免不同数据库对DD/MM/YYYY和MM/DD/YYYY的解析歧义。
内容的提问来源于stack exchange,提问作者Stacey
相关产品推荐
相关产品推荐

