SQL Server中如何准确判断用户是否年满18周岁(需考虑月日因素)
嗨,这个问题我太熟了!之前只按年份差判断确实会踩坑,毕竟生日的月日才是关键——总不能让还没到18岁生日的人提前“成年”嘛😉
咱们直接换个更精准的思路:计算用户满18岁的日期,然后看这个日期是不是小于等于今天。这样不管年份、月份还是日期,都能一次性判断到位,逻辑比分情况写清晰多了。
修改后的SQL代码(适用于SQL Server)
因为你用到了GETDATE()和DATEDIFF(year,...),应该是用的SQL Server,代码可以改成这样:
[birthdate] DATE CHECK(DATEADD(year, 18, birthdate) <= GETDATE())
如果是其他SQL方言,比如MySQL,只需要替换日期函数就行:
birthdate DATE CHECK(DATE_ADD(birthdate, INTERVAL 18 YEAR) <= CURDATE())
逻辑解释
DATEADD(year,18,birthdate)会生成用户刚好满18岁的那一天:
- 出生日期为11/7/2003的用户,加18年后是11/7/2021,只要今天≥这个日期就返回
true; - 出生日期为12/12/2003的用户,加18年后是12/12/2021,今天如果在这个日期之前,就会返回
false,完全符合你的测试需求。
备选:分情况判断的写法
要是你需要更明确的逻辑分支,也可以用这种分条件的方式:
[birthdate] DATE CHECK( -- 年份差超过18,直接符合条件 DATEDIFF(year, birthdate, GETDATE()) > 18 OR ( -- 年份差刚好18,再校验月份和日期 DATEDIFF(year, birthdate, GETDATE()) = 18 AND ( MONTH(GETDATE()) > MONTH(birthdate) OR (MONTH(GETDATE()) = MONTH(birthdate) AND DAY(GETDATE()) >= DAY(birthdate)) ) ) )
不过第一种方法更简洁高效,推荐优先使用~
内容的提问来源于stack exchange,提问作者Take it easy
相关产品推荐
相关产品推荐

