关于日期范围Left Join及SQL日期运算的技术咨询
关于SQL日期关联与运算的两个问题解答
1. 无等值匹配的日期范围Left Join逻辑
Left Join Date1 On Date1 > Date2 And Date1 < Date3 这种关联和常规等值Join的核心区别是:
- 左表的每一行,会匹配右表(Date1表)中所有满足
Date1 > Date2 And Date1 < Date3条件的行 - 如果右表没有任何行符合该日期范围条件,左表的这一行依然会保留在结果集中,只是右表对应的列全部显示为
NULL
举个实际例子:
假设左表有一行数据:Date2='2024-01-01',Date3='2024-01-10',右表Date1列有'2024-01-05'、'2024-01-08'两个值,那么左表这一行会和右表的这两行分别关联,最终结果会生成2条记录;如果右表Date1列没有落在2024-01-01到2024-01-10之间的值,结果集中只会保留左表的那一行,右表列全为NULL。
2. 日期运算公式date1 < GETDATE() + 7 - DATEPART(dw, GETDATE()) + 1解析
计算逻辑
以SQL Server为例(DATEPART(dw, 日期)默认以周日为一周第1天,周一为2,…,周六为7),拆解公式各部分:
DATEPART(dw, GETDATE()):获取当前日期是一周中的第几天(比如周三返回4)7 - DATEPART(dw, GETDATE()):计算当前日期到本周日的天数差(周三的话,7-4=3,即3天后是周日)GETDATE() + 7 - DATEPART(dw, GETDATE()) + 1:等价于GETDATE() + (8 - DATEPART(dw, GETDATE())),最终得到下周日的日期。拿周三举例:8-4=4,当前日期加4天就是下周日,所以date1 < 这个值就是筛选所有早于下周日的日期。
注:如果你的数据库DATEPART(dw)的起始天设置不同(比如周一为1),结果会有变化,需要先确认DATEFIRST配置。
日期格式转换与比较合理性
- 只要
date1是数据库的日期类型(比如date、datetime),和GETDATE()运算后的结果(也是日期类型)比较完全合理——数据库内部用数值存储日期,比较时直接对比数值大小,和显示格式无关。 - 绝对不要把日期转成字符串比较!比如
CONVERT(varchar, date1, 120) < '2024-06-23'这种写法,会按字符串字符顺序比较,容易出现逻辑错误(比如格式为dd/mm/yyyy时,'01/10/2024'字符串比'02/09/2024'小,但实际日期更大)。
内容的提问来源于stack exchange,提问作者yuyibruh
相关产品推荐
相关产品推荐

