首页 > 解决方案 > 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

标签: sqlsql-server

解决方案


如果你想要整数年(没有小数部分)......

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)只是删除今天日期的时间部分,假设您的出生日期(和计算)不考虑他们出生的确切时间;)


推荐阅读