SQL Server中BETWEEN运算符的用法及查询简化可行性咨询
如何在SQL Server中使用BETWEEN运算符?
BETWEEN是SQL Server里用来筛选列值落在**闭区间(包含起始和结束值)**内的常用运算符,语法非常直观:
column_name BETWEEN value_start AND value_end
它等价于column_name >= value_start AND column_name <= value_end,不过要注意必须保证value_start小于等于value_end,否则查询会返回空结果。
举个实际例子,假设你要从Sales表中筛选出2023年全年的销售记录:
SELECT * FROM Sales WHERE SaleDate BETWEEN '2023-01-01' AND '2023-12-31';
注意日期时间类型的坑:
如果SaleDate是datetime或datetime2类型,'2023-12-31'会被默认解析为2023-12-31 00:00:00.000,所以上面的查询会漏掉2023年12月31日当天0点之后的所有记录。如果要包含全天的数据,你可以改成:
SELECT * FROM Sales WHERE SaleDate BETWEEN '2023-01-01' AND '2023-12-31 23:59:59.997';
或者更稳妥的写法(避免毫秒精度问题):
SELECT * FROM Sales WHERE SaleDate >= '2023-01-01' AND SaleDate < '2024-01-01';
能否用BETWEEN简化
to < GETDATE() 或 GETDATE() < from的查询? 当然可以!不过得换个思路——你的原条件是筛选当前时间不在[from, to]区间内的数据,而BETWEEN本身是匹配区间内的,所以用NOT BETWEEN就能完美等价替换。
先拆解原条件的逻辑:
to < GETDATE():当前时间晚于to的时间GETDATE() < from:当前时间早于from的时间
两者用OR连接,本质就是“当前时间不在from到to的闭区间里”。
对应的简化写法:
-- 原条件 WHERE [to] < GETDATE() OR GETDATE() < [from] -- 简化后的等价写法 WHERE GETDATE() NOT BETWEEN [from] AND [to]
几个要注意的细节:
from和to是SQL Server的关键字,所以要用方括号[]把它们括起来,避免语法错误;NOT BETWEEN的逻辑是NOT (GETDATE() >= [from] AND GETDATE() <= [to]),根据德摩根定律,这完全等价于你的原条件;- 同样要注意日期时间的边界问题,如果
to是包含时分秒的类型,NOT BETWEEN里的<= [to]刚好对应原条件中[to] < GETDATE()的反向逻辑,不会出现数据遗漏。
内容的提问来源于stack exchange,提问作者omega
相关产品推荐
相关产品推荐

