sql - DateDiff 函数为客户出生日期增加了一年
问题描述
我如何更改 SQL 查询以不为客户 Mike 返回 3,因为他还不到 3 岁。如您所见,客户在 2021 年 12 月满 3 岁。但我的查询是给他 3 岁。无论如何,有没有办法改变或提出一个给他正确年龄的查询?
SELECT
id,
name,
dob,
DATEDIFF(YYYY, dob, GETDATE())
FROM
customer
WHERE
DATEDIFF(YYYY, dob, GETDATE()) >= 2
AND DATEDIFF(YYYY, dob, GETDATE()) <= 4
结果:
id name dob datediff
-------------------------------
1 Mike 2018-12-05 3
解决方案
如果你想要整数年(没有小数部分)......
SELECT
*,
CASE
WHEN DATEADD(year, diff.years, customer.dob) > GETDATE()
THEN diff.years - 1
ELSE diff.years
END
AS age
FROM
customer
CROSS APPLY
(
SELECT DATEDIFF(year, customer.dob, GETDATE()) AS years
)
AS diff
WHERE
customer.dob > DATEADD(year, -5, CAST(GETDATE() AS DATE)) -- Born more recently than 5 years ago, so at most 4 years 11 month and 30 days old
AND customer.dob <= DATEADD(year, -2, CAST(GETDATE() AS DATE)) -- Born two years ago or earlier, so at least 2 years and 0 days old
交叉应用只是为了让我可以写DATEDIFF()
一次并根据我的喜好多次引用它(不要重复自己)。
但后来我也重构了 where 子句。通过将计算移到 onGETDATE()
而不是在dob
列上,我既使数学变得更简单(比 case 语句),而且还使它dob
可以使用任何索引(SARGable)。
CAST(GETDATE() AS DATE)
只是删除今天日期的时间部分,假设您的出生日期(和计算)不考虑他们出生的确切时间;)
推荐阅读
- java - org.openqa.selenium.NoSuchElementException:没有这样的元素:无法在 selenium 中找到元素,java 使用 TestNG
- java - 这个表达式的数据类型是什么?(3 + 4 / (int)3.14) * 5
- c++ - C++ Schannel POST 400 错误代码错误请求
- javascript - 在读取流的同时发送 GET 请求
- c - 在 IAR 上为嵌入式 ARM 编译 OpenSSL
- sql - 工会条款用法
- python - 将连接查询的结果聚合到列表中
- javascript - PDF 表格大写
- javascript - 如何保留我的网页的按钮选择状态?
- apache-spark - 当指定存储级别时,在 pyspark2 中持久化数据帧不起作用。我究竟做错了什么?